Skip to content

Commit 9dd2bff

Browse files
authored
Merge pull request #177 from domaframework/kotlin-1.0.6
Kotlin 1.0.6対応
2 parents 19df6e6 + e58ae73 commit 9dd2bff

File tree

5 files changed

+11
-112
lines changed

5 files changed

+11
-112
lines changed

docs/sources/kotlin-support.rst

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ Kotlin サポート
55
.. contents:: 目次
66
:depth: 3
77

8-
Doma は `Kotlin <https://kotlinlang.org/>`_ を実験的にサポートしています
8+
Doma は `Kotlin <https://kotlinlang.org/>`_ 1.0.6を実験的にサポートしています
99

1010
Kotlin利用のベストプラクティス
1111
================================
@@ -20,7 +20,6 @@ Kotlin利用のベストプラクティス
2020
* コンストラクタは1つだけ定義する
2121
* コンストラクタ以外でプロパティを定義しない
2222
* コンストラクタで定義するプロパティには `val` を使用する
23-
* 継承は使わない
2423

2524
.. code-block:: java
2625
@@ -52,7 +51,6 @@ Kotlin利用のベストプラクティス
5251
* コンストラクタは1つだけ定義する
5352
* コンストラクタ以外でプロパティを定義しない
5453
* コンストラクタで定義するプロパティには `val` を使用する
55-
* 継承は使わない
5654
5755
.. code-block:: java
5856
@@ -62,15 +60,14 @@ Kotlin利用のベストプラクティス
6260
Daoインタフェース
6361
-------------------
6462
65-
* SQLファイルとマッピングする場合は `@ParameterName` を使ってメソッドのパラメータに名前をつける
6663
* 更新処理の戻り値の型は `org.seasar.doma.jdbc.Result` や `org.seasar.doma.jdbc.BatchResult` を使う
6764
6865
.. code-block:: java
6966
7067
@Dao(config = AppConfig::class)
7168
interface PersonDao {
7269
@Select
73-
fun selectById(@ParameterName("id") id: Int): Person
70+
fun selectById(id: Int): Person
7471
@Insert
7572
fun insert(person: Person): Result<Person>
7673
}
@@ -87,10 +84,9 @@ Daoインタフェース
8784
kaptによるビルド
8885
-------------------
8986
90-
Kotlin で記述されたクラスやインタフェースに対して注釈処理をするには `kapt <http://blog.jetbrains.com/kotlin/2015/06/better-annotation-processing-supporting-stubs-in-kapt/>`_ を実行する必要があります。
91-
2016年5月現在、Kotlin 1.0.2のkaptは機能が不足しておりかつ動作が不安定です。また、ドキュメントがありません。
92-
Daoインタフェースで `@ParameterName` を用いて明示的に名前をつけることを推奨するのも kapt の不具合に由来します。
93-
不安定な挙動を避けるため、Gradleでビルドする際、常に `clean build` を実行することを推奨します。
87+
Kotlinで記述されたクラスやインタフェースに対して注釈処理をするには `kapt <https://blog.jetbrains.com/kotlin/2016/12/kotlin-1-0-6-is-here/>`_ を実行する必要があります。
88+
kaptは実験的な位置付けにありドキュメントがありません。
89+
Gradleでビルドする際は、確実な注釈処理が行われるように常に `clean build` を実行することを推奨します。
9490
9591
.. code-block:: sh
9692
@@ -101,10 +97,8 @@ Eclispeを利用する場合設定を適切に行えばJavaの注釈処理は自
10197
JavaとKotlinの混在
10298
-------------------------
10399
104-
kaptの不具合を避けるため、Domaに関するコードの全てもしくは一部をJavaで書くことは検討に値します。
105-
特に、DaoについてはJavaで書いても良いかもしれません。
106-
JavaとKotlinで記述量にほとんど差がなく、 `@ParameterName` を使う必要性を避けられるためです。
107-
Domaの利用において、JavaとKotlinの混在は特に問題ありません。
100+
kaptの不確実な挙動を避けるため、Domaに関するコードの全てもしくは一部をJavaで書くことは検討に値します。
101+
Domaの利用において、JavaとKotlinの混在は問題ありません。
108102
109103
サンプルプロジェクト
110104
=====================

src/main/java/org/seasar/doma/internal/apt/Options.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,6 @@ public final class Options {
4747

4848
public static final String VERSION_VALIDATION = "doma.version.validation";
4949

50-
public static final String KAPT_ANNOTATIONS = "kapt.annotations";
51-
5250
public static boolean isTestEnabled(ProcessingEnvironment env) {
5351
String test = env.getOptions().get(Options.TEST);
5452
return Boolean.valueOf(test).booleanValue();
@@ -116,10 +114,6 @@ public static boolean getVersionValidation(ProcessingEnvironment env) {
116114
return v != null ? Boolean.valueOf(v).booleanValue() : true;
117115
}
118116

119-
public static boolean isKaptEnabled(ProcessingEnvironment env) {
120-
return env.getOptions().containsKey(KAPT_ANNOTATIONS);
121-
}
122-
123117
protected static class Constants {
124118

125119
public static final String DEFAULT_DAO_SUFFIX = "Impl";

src/main/java/org/seasar/doma/internal/apt/meta/EmbeddableMetaFactory.java

Lines changed: 2 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@
5353
import org.seasar.doma.internal.apt.AptException;
5454
import org.seasar.doma.internal.apt.AptIllegalStateException;
5555
import org.seasar.doma.internal.apt.Notifier;
56-
import org.seasar.doma.internal.apt.Options;
5756
import org.seasar.doma.internal.apt.mirror.EmbeddableMirror;
5857
import org.seasar.doma.internal.apt.util.ElementUtil;
5958
import org.seasar.doma.internal.apt.util.TypeMirrorUtil;
@@ -247,21 +246,8 @@ protected void doConstructor(TypeElement embeddableElement,
247246
EmbeddableConstructorMeta constructorMeta = getConstructorMeta(
248247
embeddableElement, embeddableMeta);
249248
if (constructorMeta == null) {
250-
if (Options.isKaptEnabled(env)) {
251-
constructorMeta = getConstructorMetaForKotlin(
252-
embeddableElement, embeddableMeta);
253-
if (constructorMeta == null) {
254-
throw new AptException(
255-
Message.DOMA4292,
256-
env,
257-
embeddableElement,
258-
new Object[] { embeddableElement.getQualifiedName() });
259-
}
260-
} else {
261-
throw new AptException(Message.DOMA4293, env,
262-
embeddableElement,
263-
new Object[] { embeddableElement.getQualifiedName() });
264-
}
249+
throw new AptException(Message.DOMA4293, env, embeddableElement,
250+
new Object[] { embeddableElement.getQualifiedName() });
265251
}
266252
if (constructorMeta.getConstructorElement().getModifiers()
267253
.contains(Modifier.PRIVATE)) {
@@ -271,35 +257,6 @@ protected void doConstructor(TypeElement embeddableElement,
271257
embeddableMeta.setConstructorMeta(constructorMeta);
272258
}
273259

274-
protected EmbeddableConstructorMeta getConstructorMetaForKotlin(
275-
TypeElement embeddableElement, EmbeddableMeta embeddableMeta) {
276-
for (ExecutableElement constructor : ElementFilter
277-
.constructorsIn(embeddableElement.getEnclosedElements())) {
278-
if (embeddableMeta.getEmbeddablePropertyMetas().size() == constructor
279-
.getParameters().size()) {
280-
Iterator<EmbeddablePropertyMeta> propIt = embeddableMeta
281-
.getEmbeddablePropertyMetas().iterator();
282-
Iterator<? extends VariableElement> paramIt = constructor
283-
.getParameters().iterator();
284-
int index = 0;
285-
for (; propIt.hasNext() && paramIt.hasNext();) {
286-
TypeMirror prop = propIt.next().getType();
287-
TypeMirror param = paramIt.next().asType();
288-
if (!TypeMirrorUtil.isSameType(prop, param, env)) {
289-
throw new AptException(Message.DOMA4308, env,
290-
embeddableElement, new Object[] { prop, param,
291-
index,
292-
embeddableElement.getQualifiedName() });
293-
}
294-
index++;
295-
}
296-
return new EmbeddableConstructorMeta(constructor,
297-
embeddableMeta.getEmbeddablePropertyMetas());
298-
}
299-
}
300-
return null;
301-
}
302-
303260
protected EmbeddableConstructorMeta getConstructorMeta(
304261
TypeElement embeddapleElement, EmbeddableMeta embeddableMeta) {
305262
Map<String, EmbeddablePropertyMeta> propertyMetaMap = new HashMap<String, EmbeddablePropertyMeta>();

src/main/java/org/seasar/doma/internal/apt/meta/EntityMetaFactory.java

Lines changed: 2 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@
5353
import org.seasar.doma.internal.apt.AptException;
5454
import org.seasar.doma.internal.apt.AptIllegalStateException;
5555
import org.seasar.doma.internal.apt.Notifier;
56-
import org.seasar.doma.internal.apt.Options;
5756
import org.seasar.doma.internal.apt.mirror.EntityMirror;
5857
import org.seasar.doma.internal.apt.mirror.TableMirror;
5958
import org.seasar.doma.internal.apt.util.AnnotationValueUtil;
@@ -630,20 +629,8 @@ protected void doConstructor(TypeElement classElement, EntityMeta entityMeta) {
630629
EntityConstructorMeta constructorMeta = getConstructorMeta(
631630
classElement, entityMeta);
632631
if (constructorMeta == null) {
633-
if (Options.isKaptEnabled(env)) {
634-
constructorMeta = getConstructorMetaForKotlin(classElement,
635-
entityMeta);
636-
if (constructorMeta == null) {
637-
throw new AptException(
638-
Message.DOMA4282,
639-
env,
640-
classElement,
641-
new Object[] { classElement.getQualifiedName() });
642-
}
643-
} else {
644-
throw new AptException(Message.DOMA4281, env, classElement,
645-
new Object[] { classElement.getQualifiedName() });
646-
}
632+
throw new AptException(Message.DOMA4281, env, classElement,
633+
new Object[] { classElement.getQualifiedName() });
647634
}
648635
if (constructorMeta.getConstructorElement().getModifiers()
649636
.contains(Modifier.PRIVATE)) {
@@ -662,35 +649,6 @@ protected void doConstructor(TypeElement classElement, EntityMeta entityMeta) {
662649
}
663650
}
664651

665-
protected EntityConstructorMeta getConstructorMetaForKotlin(
666-
TypeElement classElement, EntityMeta entityMeta) {
667-
for (ExecutableElement constructor : ElementFilter
668-
.constructorsIn(classElement.getEnclosedElements())) {
669-
if (entityMeta.getAllPropertyMetas().size() == constructor
670-
.getParameters().size()) {
671-
Iterator<EntityPropertyMeta> propIt = entityMeta
672-
.getAllPropertyMetas().iterator();
673-
Iterator<? extends VariableElement> paramIt = constructor
674-
.getParameters().iterator();
675-
int index = 0;
676-
for (; propIt.hasNext() && paramIt.hasNext();) {
677-
TypeMirror prop = propIt.next().getType();
678-
TypeMirror param = paramIt.next().asType();
679-
if (!TypeMirrorUtil.isSameType(prop, param, env)) {
680-
throw new AptException(Message.DOMA4307, env,
681-
classElement,
682-
new Object[] { prop, param, index,
683-
classElement.getQualifiedName() });
684-
}
685-
index++;
686-
}
687-
return new EntityConstructorMeta(constructor,
688-
entityMeta.getAllPropertyMetas());
689-
}
690-
}
691-
return null;
692-
}
693-
694652
protected EntityConstructorMeta getConstructorMeta(
695653
TypeElement classElement, EntityMeta entityMeta) {
696654
Map<String, EntityPropertyMeta> entityPropertyMetaMap = new HashMap<String, EntityPropertyMeta>();

src/main/java/org/seasar/doma/message/Message.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -425,15 +425,13 @@ public enum Message implements MessageResource {
425425
DOMA4279("型[{0}]がローカルクラスもしくは無名クラスです。DomainConverterの第1型引数に指定された型もしくはその型を囲む型はトップレベルもしくはメンバでなければいけません。"),
426426
DOMA4280("型[{0}]の単純名に\"$\"または\"__\"が含まれています。DomainConverterの第1型引数に指定された型もしくはその型を囲む型はこれらの文字列を単純名に含んではいけません。"),
427427
DOMA4281("イミュータブルなエンティティクラスではコンストラクタのパラメータの数と型と名前は永続対象フィールドに一致しなければいけません。 at {0}"),
428-
DOMA4282("Kotlinでイミュータブルなエンティティクラスを定義する場合、すべてのプロパティをコンストラクタで宣言しなければいけません。 at {0}"),
429428
DOMA4283("@Embeddableはクラス以外には注釈できません。 at {0}"),
430429
DOMA4285("エンベッダブルクラスには型パラメータを定義できません。 at {0}"),
431430
DOMA4286("エンベッダブルクラスのフィールドには@OriginalStatesを注釈できません。 at {0}.{1}"),
432431
DOMA4288("アノテーション[{0}]とアノテーション[{1}]が競合しています。これらは同じフィールドに注釈できません。 at {2}.{3}"),
433432
DOMA4289("エンベッダブルクラスのフィールドには@Idを注釈できません。 at {0}.{1}"),
434433
DOMA4290("エンベッダブルクラスのフィールドには@Versionを注釈できません。 at {0}.{1}"),
435434
DOMA4291("エンベッダブルクラスのフィールドには@GeneratedValueを注釈できません。 at {0}.{1}"),
436-
DOMA4292("Kotlinでエンベッダブルクラスを定義する場合、すべてのプロパティをコンストラクタで宣言しなければいけません。 at {0}"),
437435
DOMA4293("エンベッダブルクラスではコンストラクタのパラメータの数と型と名前は永続対象フィールドに一致しなければいけません。 at {0}"),
438436
DOMA4294("エンベッダブルクラスには非privateなコンストラクタが必要です。 at {0}"),
439437
DOMA4295("クラス[{0}]の原型は永続プロパティに使用できません。 at {1}.{2}"),
@@ -448,8 +446,6 @@ public enum Message implements MessageResource {
448446
DOMA4304("@Versionは@Embeddableが注釈された型のプロパティに注釈できません。 at {0}.{1}"),
449447
DOMA4305("@OriginalStatesを使用する場合、エンティティクラスのプロパティに@Embeddableが注釈された型を使うことはサポートされていません。 at {0}"),
450448
DOMA4306("@Columnは@Embeddableが注釈された型のプロパティに注釈できません。 at {0}.{1}"),
451-
DOMA4307("永続プロパティの型[{0}]とコンストラクタパラメータの型[{1}]が[{2}]番目で一致しません。Kotlinでエンベッダブルクラスを定義する場合、永続プロパティとコンストラクタのパラメータの宣言順序は一致しなければいけません。継承している場合、コンストラクタパラメータの宣言順序は親クラスに定義されたプロパティ順でなければいけません。 at {3}"),
452-
DOMA4308("永続プロパティの型[{0}]とコンストラクタパラメータの型[{1}]が[{2}]番目で一致しません。Kotlinでエンティティクラスを定義する場合、永続プロパティとコンストラクタのパラメータの宣言順序は一致しなければいけません。継承している場合、コンストラクタパラメータの宣言順序は親クラスに定義されたプロパティ順でなければいけません。 at {3}"),
453449
DOMA4309("ファイルパス[{0}]の大文字小文字がファイルシステム上のパスと一致しません。ファイルシステム上のパスは\"{1}\"です。"),
454450
DOMA4315("型[{0}]がpublicかつstaticでありません。エンティティクラスもしくはエンティティクラスを囲む型はpublicかつstaticでなければいけません。"),
455451
DOMA4316("型[{0}]がローカルクラスもしくは無名クラスです。エンティティクラスもしくはエンティティクラスを囲む型はトップレベルもしくはメンバでなければいけません。"),

0 commit comments

Comments
 (0)