Skip to content

Commit f1fd264

Browse files
authored
24 prevent nonstatic class (#36)
* Reuse code via simlink between it java8 and java17 * Report error for non-static inner class
1 parent 9e248af commit f1fd264

30 files changed

+173
-99
lines changed

doc/Development.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Development Guide
22

33
## Setup
4-
Linux is recommended. If you use Windows, you can use WSL with a remotely connected IDE. Windows 11 supports GUI app inside WSL.
4+
**Linux is assumed**. If you use Windows, you can use WSL with a remotely connected IDE. Windows 11 supports GUI app inside WSL.
55

66
Setup Java env vars (>= Java17 for development), configure `JAVA17_HOME` to point to your Java installation:
77
```bash

doc/Usage.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,3 +86,5 @@ See Javadoc on [@SharedType](../annotation/src/main/java/org/sharedtype/annotati
8686
* Current design only retain `@SharedType` on source level. That means they are not visible if it is in a dependency jar during its dependent's compilation.
8787
You have to execute the annotation processing on the same classpath with source code.
8888
For multiple module builds, a workaround is to execute on every module.
89+
* Non-static inner classes are not supported. Instance class may refer to its enclosing class's generic type without the type declaration on its own,
90+
which could break the generated code. Later version of SharedType may loosen this limitation.

it/java17/src/main/java/org/sharedtype/it/types/JavaRecord.java renamed to it/java17/src/main/java/org/sharedtype/it/java17/JavaRecord.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
1-
package org.sharedtype.it.types;
1+
package org.sharedtype.it.java17;
22

33
import org.sharedtype.annotation.SharedType;
4+
import org.sharedtype.it.java8.Container;
5+
import org.sharedtype.it.java8.DependencyClassA;
6+
import org.sharedtype.it.java8.EnumGalaxy;
7+
import org.sharedtype.it.java8.EnumSize;
8+
import org.sharedtype.it.java8.InterfaceA;
49

510
import java.util.Collection;
611
import java.util.List;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../../../../../../../java8/src/main/java/org/sharedtype/it/java8

it/java17/src/main/java/org/sharedtype/it/java8_is_symlink

Whitespace-only changes.

it/java17/src/main/java/org/sharedtype/it/types/SuperClassA.java

Lines changed: 0 additions & 5 deletions
This file was deleted.

it/java17/src/test/java/org/sharedtype/domain/JavaRecordIntegrationTest.java renamed to it/java17/src/test/java/org/sharedtype/it/JavaRecordIntegrationTest.java

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1-
package org.sharedtype.domain;
1+
package org.sharedtype.it;
22

33
import org.junit.jupiter.api.Test;
44
import org.junit.jupiter.api.TestInstance;
5+
import org.sharedtype.domain.ArrayTypeInfo;
6+
import org.sharedtype.domain.ClassDef;
7+
import org.sharedtype.domain.ConcreteTypeInfo;
58

69
import static org.assertj.core.api.Assertions.assertThat;
7-
import static org.sharedtype.domain.TypeDefDeserializer.deserializeTypeDef;
10+
import static org.sharedtype.it.TypeDefDeserializer.deserializeTypeDef;
811

912
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
1013
final class JavaRecordIntegrationTest {
@@ -25,7 +28,7 @@ void supertypes() {
2528
assertThat(superTypes).hasSize(1);
2629
var supertypeInfo = (ConcreteTypeInfo)superTypes.get(0);
2730
assertThat(supertypeInfo.resolved()).isTrue();
28-
assertThat(supertypeInfo.qualifiedName()).isEqualTo("org.sharedtype.it.types.InterfaceA");
31+
assertThat(supertypeInfo.qualifiedName()).isEqualTo("org.sharedtype.it.java8.InterfaceA");
2932
}
3033

3134
@Test
@@ -185,7 +188,7 @@ void cyclicDependencyField() {
185188
var cyclicDependencyField = classDef.components().get(19);
186189
assertThat(cyclicDependencyField.name()).isEqualTo("cyclicDependency");
187190
var typeInfo = (ConcreteTypeInfo)cyclicDependencyField.type();
188-
assertThat(typeInfo.qualifiedName()).isEqualTo("org.sharedtype.it.types.DependencyClassA");
191+
assertThat(typeInfo.qualifiedName()).isEqualTo("org.sharedtype.it.java8.DependencyClassA");
189192
}
190193

191194
@Test
@@ -194,7 +197,7 @@ void containerStringListField() {
194197
assertThat(containerStringListField.name()).isEqualTo("containerStringList");
195198
var arrayTypeInfo = (ArrayTypeInfo)containerStringListField.type();
196199
var typeInfo = (ConcreteTypeInfo)arrayTypeInfo.component();
197-
assertThat(typeInfo.qualifiedName()).isEqualTo("org.sharedtype.it.types.Container");
200+
assertThat(typeInfo.qualifiedName()).isEqualTo("org.sharedtype.it.java8.Container");
198201
var typeArgInfo = (ConcreteTypeInfo)typeInfo.typeArgs().get(0);
199202
assertThat(typeArgInfo.qualifiedName()).isEqualTo("java.lang.String");
200203
}
@@ -206,7 +209,7 @@ void containerStringListCollectionField() {
206209
var arrayTypeInfo = (ArrayTypeInfo)containerStringListCollectionField.type();
207210
var nestedArrayTypeInfo = (ArrayTypeInfo)arrayTypeInfo.component();
208211
var typeInfo = (ConcreteTypeInfo)nestedArrayTypeInfo.component();
209-
assertThat(typeInfo.qualifiedName()).isEqualTo("org.sharedtype.it.types.Container");
212+
assertThat(typeInfo.qualifiedName()).isEqualTo("org.sharedtype.it.java8.Container");
210213
var typeArgInfo = (ConcreteTypeInfo)typeInfo.typeArgs().get(0);
211214
assertThat(typeArgInfo.qualifiedName()).isEqualTo("java.lang.String");
212215
}
@@ -267,15 +270,15 @@ void enumGalaxyField() {
267270
var enumGalaxyField = classDef.components().get(28);
268271
assertThat(enumGalaxyField.name()).isEqualTo("enumGalaxy");
269272
var typeInfo = (ConcreteTypeInfo)enumGalaxyField.type();
270-
assertThat(typeInfo.qualifiedName()).isEqualTo("org.sharedtype.it.types.EnumGalaxy");
273+
assertThat(typeInfo.qualifiedName()).isEqualTo("org.sharedtype.it.java8.EnumGalaxy");
271274
}
272275

273276
@Test
274277
void enumSizeField() {
275278
var enumSizeField = classDef.components().get(29);
276279
assertThat(enumSizeField.name()).isEqualTo("enumSize");
277280
var typeInfo = (ConcreteTypeInfo)enumSizeField.type();
278-
assertThat(typeInfo.qualifiedName()).isEqualTo("org.sharedtype.it.types.EnumSize");
281+
assertThat(typeInfo.qualifiedName()).isEqualTo("org.sharedtype.it.java8.EnumSize");
279282
}
280283

281284
@Test

it/java17/src/test/java/org/sharedtype/domain/TypeDefIntegrationTest.java renamed to it/java17/src/test/java/org/sharedtype/it/TypeDefIntegrationTest.java

Lines changed: 37 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,121 +1,126 @@
1-
package org.sharedtype.domain;
1+
package org.sharedtype.it;
22

3+
import lombok.val;
34
import org.assertj.core.api.SoftAssertions;
45
import org.junit.jupiter.api.Test;
6+
import org.sharedtype.domain.ClassDef;
7+
import org.sharedtype.domain.ConcreteTypeInfo;
8+
import org.sharedtype.domain.EnumDef;
9+
import org.sharedtype.domain.TypeVariableInfo;
510

611
import static org.assertj.core.api.Assertions.assertThat;
7-
import static org.sharedtype.domain.TypeDefDeserializer.deserializeTypeDef;
12+
import static org.sharedtype.it.TypeDefDeserializer.deserializeTypeDef;
813

914
final class TypeDefIntegrationTest {
1015
@Test
1116
void container() {
12-
var container = (ClassDef) deserializeTypeDef("Container.ser");
17+
ClassDef container = (ClassDef) deserializeTypeDef("Container.ser");
1318
SoftAssertions.assertSoftly(softly -> {
1419
softly.assertThat(container.simpleName()).isEqualTo("Container");
15-
softly.assertThat(container.qualifiedName()).isEqualTo("org.sharedtype.it.types.Container");
20+
softly.assertThat(container.qualifiedName()).isEqualTo("org.sharedtype.it.java8.Container");
1621
softly.assertThat(container.components()).hasSize(1);
17-
var component1 = container.components().get(0);
18-
var field1Type = (TypeVariableInfo) component1.type();
22+
val component1 = container.components().get(0);
23+
val field1Type = (TypeVariableInfo) component1.type();
1924
softly.assertThat(field1Type.getName()).isEqualTo("T");
2025
softly.assertThat(component1.name()).isEqualTo("t");
2126

2227
softly.assertThat(container.resolved()).isTrue();
2328
softly.assertThat(container.typeVariables()).hasSize(1);
24-
var typeVariable1 = container.typeVariables().get(0);
29+
val typeVariable1 = container.typeVariables().get(0);
2530
softly.assertThat(typeVariable1.getName()).isEqualTo("T");
2631
});
2732
}
2833

2934
@Test
3035
void dependencyClassA() {
31-
var classA = (ClassDef) deserializeTypeDef("DependencyClassA.ser");
36+
ClassDef classA = (ClassDef) deserializeTypeDef("DependencyClassA.ser");
3237
SoftAssertions.assertSoftly(softly -> {
3338
softly.assertThat(classA.simpleName()).isEqualTo("DependencyClassA");
34-
softly.assertThat(classA.qualifiedName()).isEqualTo("org.sharedtype.it.types.DependencyClassA");
39+
softly.assertThat(classA.qualifiedName()).isEqualTo("org.sharedtype.it.java8.DependencyClassA");
3540
softly.assertThat(classA.components()).hasSize(1);
3641

37-
var component1 = classA.components().get(0);
42+
val component1 = classA.components().get(0);
3843
softly.assertThat(component1.optional()).isFalse();
3944
softly.assertThat(component1.name()).isEqualTo("b");
4045
softly.assertThat(component1.type().resolved()).isTrue();
41-
var component1type = (ConcreteTypeInfo) component1.type();
42-
softly.assertThat(component1type.qualifiedName()).isEqualTo("org.sharedtype.it.types.DependencyClassB");
46+
val component1type = (ConcreteTypeInfo) component1.type();
47+
softly.assertThat(component1type.qualifiedName()).isEqualTo("org.sharedtype.it.java8.DependencyClassB");
4348

4449
softly.assertThat(classA.typeVariables()).isEmpty();
4550
softly.assertThat(classA.supertypes()).hasSize(1);
46-
var supertype1 = (ConcreteTypeInfo)classA.supertypes().get(0);
51+
val supertype1 = (ConcreteTypeInfo)classA.supertypes().get(0);
4752
softly.assertThat(supertype1.resolved()).isTrue();
48-
softly.assertThat(supertype1.qualifiedName()).isEqualTo("org.sharedtype.it.types.SuperClassA");
53+
softly.assertThat(supertype1.qualifiedName()).isEqualTo("org.sharedtype.it.java8.SuperClassA");
4954
softly.assertThat(classA.resolved()).isTrue();
5055
});
5156
}
5257

5358
@Test
5459
void dependencyClassB() {
55-
var classB = (ClassDef) deserializeTypeDef("DependencyClassB.ser");
60+
ClassDef classB = (ClassDef) deserializeTypeDef("DependencyClassB.ser");
5661
assertThat(classB.simpleName()).isEqualTo("DependencyClassB");
5762
}
5863

5964
@Test
6065
void dependencyClassC() {
61-
var classC = (ClassDef) deserializeTypeDef("DependencyClassC.ser");
66+
ClassDef classC = (ClassDef) deserializeTypeDef("DependencyClassC.ser");
6267
assertThat(classC.simpleName()).isEqualTo("DependencyClassC");
6368
}
6469

6570
@Test
6671
void enumGalaxy() {
67-
var enumGalaxy = (EnumDef) deserializeTypeDef("EnumGalaxy.ser");
72+
EnumDef enumGalaxy = (EnumDef) deserializeTypeDef("EnumGalaxy.ser");
6873
assertThat(enumGalaxy.simpleName()).isEqualTo("EnumGalaxy");
69-
assertThat(enumGalaxy.qualifiedName()).isEqualTo("org.sharedtype.it.types.EnumGalaxy");
74+
assertThat(enumGalaxy.qualifiedName()).isEqualTo("org.sharedtype.it.java8.EnumGalaxy");
7075
assertThat(enumGalaxy.components()).hasSize(3).allMatch(constant -> {
71-
var typeInfo = (ConcreteTypeInfo)constant.type();
76+
ConcreteTypeInfo typeInfo = (ConcreteTypeInfo)constant.type();
7277
return typeInfo.qualifiedName().equals("java.lang.String");
7378
});
74-
var constant1 = enumGalaxy.components().get(0);
79+
val constant1 = enumGalaxy.components().get(0);
7580
assertThat(constant1.value()).isEqualTo("MilkyWay");
7681

77-
var constant2 = enumGalaxy.components().get(1);
82+
val constant2 = enumGalaxy.components().get(1);
7883
assertThat(constant2.value()).isEqualTo("Andromeda");
7984

80-
var constant3 = enumGalaxy.components().get(2);
85+
val constant3 = enumGalaxy.components().get(2);
8186
assertThat(constant3.value()).isEqualTo("Triangulum");
8287
}
8388

8489
@Test
8590
void enumSize() {
86-
var enumSize = (EnumDef) deserializeTypeDef("EnumSize.ser");
91+
EnumDef enumSize = (EnumDef) deserializeTypeDef("EnumSize.ser");
8792
assertThat(enumSize.simpleName()).isEqualTo("EnumSize");
88-
assertThat(enumSize.qualifiedName()).isEqualTo("org.sharedtype.it.types.EnumSize");
93+
assertThat(enumSize.qualifiedName()).isEqualTo("org.sharedtype.it.java8.EnumSize");
8994
assertThat(enumSize.components()).hasSize(3).allMatch(constant -> {
90-
var typeInfo = (ConcreteTypeInfo)constant.type();
95+
ConcreteTypeInfo typeInfo = (ConcreteTypeInfo)constant.type();
9196
return typeInfo.qualifiedName().equals("int");
9297
});
9398

94-
var constant1 = enumSize.components().get(0);
99+
val constant1 = enumSize.components().get(0);
95100
assertThat(constant1.value()).isEqualTo(1);
96101

97-
var constant2 = enumSize.components().get(1);
102+
val constant2 = enumSize.components().get(1);
98103
assertThat(constant2.value()).isEqualTo(2);
99104

100-
var constant3 = enumSize.components().get(2);
105+
val constant3 = enumSize.components().get(2);
101106
assertThat(constant3.value()).isEqualTo(3);
102107
}
103108

104109
@Test
105110
void interfaceA() {
106-
var interfaceA = (ClassDef) deserializeTypeDef("InterfaceA.ser");
111+
ClassDef interfaceA = (ClassDef) deserializeTypeDef("InterfaceA.ser");
107112
assertThat(interfaceA.simpleName()).isEqualTo("InterfaceA");
108113
}
109114

110115
@Test
111116
void superClassA() {
112-
var superClassA = (ClassDef) deserializeTypeDef("SuperClassA.ser");
117+
ClassDef superClassA = (ClassDef) deserializeTypeDef("SuperClassA.ser");
113118
SoftAssertions.assertSoftly(softly -> {
114119
softly.assertThat(superClassA.simpleName()).isEqualTo("SuperClassA");
115120
softly.assertThat(superClassA.components()).hasSize(1);
116-
var component1 = superClassA.components().get(0);
121+
val component1 = superClassA.components().get(0);
117122
softly.assertThat(component1.name()).isEqualTo("a");
118-
var component1type = (ConcreteTypeInfo) component1.type();
123+
val component1type = (ConcreteTypeInfo) component1.type();
119124
softly.assertThat(component1type.qualifiedName()).isEqualTo("int");
120125
});
121126
}
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
package org.sharedtype.it.types;
1+
package org.sharedtype.it.java8;
22

33
import lombok.Getter;
44
import lombok.Setter;
55

66
@Getter
77
@Setter
8-
final class Container<T> {
8+
public final class Container<T> {
99
private T t;
1010
}
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
package org.sharedtype.it.types;
1+
package org.sharedtype.it.java8;
22

33
import lombok.RequiredArgsConstructor;
44

55
@RequiredArgsConstructor
6-
final class DependencyClassA extends SuperClassA{
6+
public final class DependencyClassA extends SuperClassA{
77
private final DependencyClassB b;
88
}

0 commit comments

Comments
 (0)