Skip to content

Commit 41dd190

Browse files
ifrankwangfiliphr
authored andcommitted
#20 Kotlin support for target / source in Mapping and ValueMapping
1 parent 89e9a6e commit 41dd190

20 files changed

+331
-54
lines changed

build.gradle

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
1+
import com.hierynomus.gradle.license.tasks.LicenseCheck
2+
import com.hierynomus.gradle.license.tasks.LicenseFormat
3+
14
plugins {
2-
id "org.jetbrains.intellij" version "0.4.18"
5+
id "org.jetbrains.intellij" version "0.4.21"
36
id "com.github.hierynomus.license" version "0.14.0"
47
id "de.undercouch.download" version "4.0.4"
8+
id 'org.jetbrains.kotlin.jvm' version '1.3.71'
59
}
610

711

@@ -14,6 +18,7 @@ apply plugin: 'org.jetbrains.intellij'
1418
apply plugin: 'license'
1519
apply plugin: 'checkstyle'
1620
apply plugin: 'jacoco'
21+
apply plugin: 'kotlin'
1722

1823
sourceCompatibility = 1.8
1924
targetCompatibility = 1.8
@@ -27,15 +32,29 @@ repositories {
2732
}
2833

2934
intellij {
30-
version System.getenv().getOrDefault('IDEA_VERSION', ideaVersion)
35+
version System.getenv().getOrDefault('IDEA_VERSION', '2020.1.4')
3136
type ideaType
3237
downloadSources Boolean.valueOf(sources)
3338
sameSinceUntilBuild Boolean.valueOf(isEAP)
3439
alternativeIdePath idePath
3540
updateSinceUntilBuild false
3641
pluginName 'MapStruct-Intellij-Plugin'
3742
if ( !(version.startsWith('2018') || version.startsWith('2019.1'))) {
38-
plugins 'java'
43+
plugins = ['java', 'Kotlin', 'properties']
44+
} else {
45+
plugins = ['Kotlin', 'properties']
46+
}
47+
}
48+
49+
compileKotlin {
50+
kotlinOptions {
51+
jvmTarget = "1.8"
52+
}
53+
}
54+
55+
compileTestKotlin {
56+
kotlinOptions {
57+
jvmTarget = "1.8"
3958
}
4059
}
4160

@@ -47,10 +66,14 @@ patchPluginXml {
4766
pluginDescription = htmlFixer('description.html')
4867
}
4968

50-
task licenseTestData(type: com.hierynomus.gradle.license.tasks.LicenseCheck) {
69+
task licenseTestData(type: LicenseCheck) {
5170
source = fileTree(dir: "testData").include("**/*")
5271
}
5372

73+
task licenseFormatForKotlin(type: LicenseFormat) {
74+
source = fileTree(dir: "src/main").include("**/*.kt").include("**/*.xml")
75+
}
76+
5477
license {
5578
header rootProject.file('etc/license.txt')
5679
strictCheck true
@@ -64,6 +87,7 @@ license {
6487
])
6588
}
6689

90+
licenseFormat.dependsOn licenseFormatForKotlin
6791
licenseTest.dependsOn licenseTestData
6892

6993
checkstyle {
@@ -82,6 +106,7 @@ jacocoTestReport {
82106
}
83107

84108
dependencies {
109+
compile 'org.jetbrains.kotlin:kotlin-stdlib-jdk8'
85110
compile group: 'org.mapstruct', name: 'mapstruct', version: '1.4.0.Beta1'
86111
testCompile group: 'junit', name: 'junit', version: '4.12'
87112
testCompile group: 'org.assertj', name: 'assertj-core', version: '3.11.1'

src/main/java/org/mapstruct/intellij/codeinsight/references/BaseReference.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,32 +6,32 @@
66
package org.mapstruct.intellij.codeinsight.references;
77

88
import com.intellij.openapi.util.TextRange;
9-
import com.intellij.psi.PsiLiteral;
9+
import com.intellij.psi.PsiElement;
1010
import com.intellij.psi.PsiMethod;
1111
import com.intellij.psi.PsiReferenceBase;
12-
import com.intellij.psi.util.PsiTreeUtil;
1312
import org.jetbrains.annotations.NotNull;
1413
import org.jetbrains.annotations.Nullable;
14+
import org.mapstruct.intellij.util.MapstructUtilKt;
1515

1616
/**
1717
* Base Reference for MapStruct.
1818
*
1919
* @author Filip Hrisafov
2020
*/
21-
abstract class BaseReference extends PsiReferenceBase<PsiLiteral> {
21+
abstract class BaseReference extends PsiReferenceBase<PsiElement> {
2222

2323
/**
2424
* @param element the element for which a reference should be found
2525
*/
26-
BaseReference(@NotNull PsiLiteral element) {
26+
BaseReference(@NotNull PsiElement element) {
2727
super( element );
2828
}
2929

3030
/**
3131
* @param element the element for which a reference should be found
3232
* @param rangeInElement the range in the element
3333
*/
34-
BaseReference(PsiLiteral element, TextRange rangeInElement) {
34+
BaseReference(PsiElement element, TextRange rangeInElement) {
3535
super( element, rangeInElement );
3636
}
3737

@@ -40,6 +40,6 @@ abstract class BaseReference extends PsiReferenceBase<PsiLiteral> {
4040
*/
4141
@Nullable
4242
PsiMethod getMappingMethod() {
43-
return PsiTreeUtil.getParentOfType( getElement(), PsiMethod.class );
43+
return MapstructUtilKt.getPsiMethod( getElement() );
4444
}
4545
}

src/main/java/org/mapstruct/intellij/codeinsight/references/BaseValueMappingReference.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
import com.intellij.codeInsight.lookup.LookupElement;
99
import com.intellij.psi.PsiElement;
10-
import com.intellij.psi.PsiLiteral;
1110
import com.intellij.psi.PsiMethod;
1211
import org.jetbrains.annotations.NotNull;
1312
import org.jetbrains.annotations.Nullable;
@@ -22,7 +21,7 @@ abstract class BaseValueMappingReference extends BaseReference {
2221
/**
2322
* @param element the element for which a reference should be found
2423
*/
25-
BaseValueMappingReference(@NotNull PsiLiteral element) {
24+
BaseValueMappingReference(@NotNull PsiElement element) {
2625
super( element );
2726
}
2827

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/**
2+
* Copyright MapStruct Authors.
3+
*
4+
* Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
5+
*/
6+
package org.mapstruct.intellij.codeinsight.references
7+
8+
import com.intellij.psi.PsiReferenceContributor
9+
import com.intellij.psi.PsiReferenceRegistrar
10+
import org.mapstruct.intellij.util.toMappingElementPattern
11+
import org.mapstruct.intellij.util.toMappingsElementPattern
12+
import org.mapstruct.intellij.util.toValueMappingPattern
13+
import org.mapstruct.intellij.util.toValueMappingsPattern
14+
15+
16+
/**
17+
* @author Frank Wang
18+
*/
19+
class KtMapstructReferenceContributor : PsiReferenceContributor() {
20+
21+
override fun registerReferenceProviders(registrar: PsiReferenceRegistrar) {
22+
registrar.registerReferenceProvider(
23+
"target".toMappingElementPattern(),
24+
MappingTargetReferenceProvider(MapstructTargetReference::create)
25+
)
26+
registrar.registerReferenceProvider(
27+
"source".toMappingElementPattern(),
28+
MappingTargetReferenceProvider(MapstructSourceReference::create)
29+
)
30+
registrar.registerReferenceProvider(
31+
"target".toMappingsElementPattern(),
32+
MappingTargetReferenceProvider(MapstructTargetReference::create)
33+
)
34+
registrar.registerReferenceProvider(
35+
"source".toMappingsElementPattern(),
36+
MappingTargetReferenceProvider(MapstructSourceReference::create)
37+
)
38+
39+
registrar.registerReferenceProvider(
40+
"target".toValueMappingPattern(),
41+
MappingTargetReferenceProvider(ValueMappingSourceReference::create)
42+
)
43+
registrar.registerReferenceProvider(
44+
"source".toValueMappingPattern(),
45+
MappingTargetReferenceProvider(ValueMappingTargetReference::create)
46+
)
47+
registrar.registerReferenceProvider(
48+
"target".toValueMappingsPattern(),
49+
MappingTargetReferenceProvider(ValueMappingSourceReference::create)
50+
)
51+
registrar.registerReferenceProvider(
52+
"source".toValueMappingsPattern(),
53+
MappingTargetReferenceProvider(ValueMappingTargetReference::create)
54+
)
55+
}
56+
}

src/main/java/org/mapstruct/intellij/codeinsight/references/MappingTargetReferenceProvider.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,34 +5,33 @@
55
*/
66
package org.mapstruct.intellij.codeinsight.references;
77

8-
import java.util.function.Function;
9-
108
import com.intellij.psi.PsiElement;
11-
import com.intellij.psi.PsiLiteral;
129
import com.intellij.psi.PsiReference;
1310
import com.intellij.psi.PsiReferenceProvider;
1411
import com.intellij.util.ProcessingContext;
1512
import org.jetbrains.annotations.NotNull;
1613

14+
import java.util.function.Function;
15+
1716
/**
1817
* {@link PsiReferenceProvider} for references in target / source properties of {@link org.mapstruct.Mapping}.
1918
*
2019
* @author Filip Hrisafov
2120
*/
2221
class MappingTargetReferenceProvider extends PsiReferenceProvider {
2322

24-
private final Function<PsiLiteral, PsiReference[]> reference;
23+
private final Function<PsiElement, PsiReference[]> reference;
2524

2625
/**
2726
* @param reference the function that can be used to create the references array
2827
*/
29-
MappingTargetReferenceProvider(Function<PsiLiteral, PsiReference[]> reference) {
28+
MappingTargetReferenceProvider(Function<PsiElement, PsiReference[]> reference) {
3029
this.reference = reference;
3130
}
3231

3332
@NotNull
3433
@Override
3534
public PsiReference[] getReferencesByElement(@NotNull PsiElement element, @NotNull ProcessingContext context) {
36-
return reference.apply( (PsiLiteral) element );
35+
return reference.apply( element );
3736
}
3837
}

src/main/java/org/mapstruct/intellij/codeinsight/references/MapstructBaseReference.java

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import com.intellij.psi.ElementManipulator;
1111
import com.intellij.psi.ElementManipulators;
1212
import com.intellij.psi.PsiElement;
13-
import com.intellij.psi.PsiLiteral;
1413
import com.intellij.psi.PsiMethod;
1514
import com.intellij.psi.PsiReference;
1615
import com.intellij.psi.PsiType;
@@ -37,7 +36,7 @@ abstract class MapstructBaseReference extends BaseReference {
3736
* @param previous the previous reference ({@code null} if there is no previous reference)
3837
* @param rangeInElement the range in the {@code element} for which this reference is valid
3938
*/
40-
MapstructBaseReference(@NotNull PsiLiteral element,
39+
MapstructBaseReference(@NotNull PsiElement element,
4140
@Nullable MapstructBaseReference previous, TextRange rangeInElement) {
4241
super( element, rangeInElement );
4342
this.previous = previous;
@@ -127,7 +126,7 @@ public final Object[] getVariants() {
127126
abstract PsiType resolvedType();
128127

129128
@Override
130-
public PsiElement handleElementRename(String newElementName) throws IncorrectOperationException {
129+
public PsiElement handleElementRename(@NotNull String newElementName) throws IncorrectOperationException {
131130
PsiElement reference = resolve();
132131
if ( reference instanceof PsiMethod ) {
133132
return super.handleElementRename( MapstructUtil.getPropertyName( newElementName ) );
@@ -137,24 +136,24 @@ public PsiElement handleElementRename(String newElementName) throws IncorrectOpe
137136
}
138137
}
139138

140-
private static ElementManipulator<PsiLiteral> getManipulator(PsiLiteral psiLiteral) {
141-
return ElementManipulators.getNotNullManipulator( psiLiteral );
139+
private static ElementManipulator<PsiElement> getManipulator(PsiElement psiElement) {
140+
return ElementManipulators.getNotNullManipulator( psiElement );
142141
}
143142

144143
/**
145144
* Create all the references for the provided {@code psiLiteral}.
146145
*
147-
* @param psiLiteral the literal that contain
146+
* @param psiElement the literal that contain
148147
* @param creator The creator that should be used to create new references
149148
* @param <T> the type of the reference that needs to be created
150149
*
151150
* @return the array of all the references
152151
*/
153-
static <T extends MapstructBaseReference> PsiReference[] create(PsiLiteral psiLiteral,
152+
static <T extends MapstructBaseReference> PsiReference[] create(PsiElement psiElement,
154153
ReferenceCreator<T> creator) {
155-
ElementManipulator<PsiLiteral> manipulator = getManipulator( psiLiteral );
156-
TextRange rangeInElement = manipulator.getRangeInElement( psiLiteral );
157-
String targetValue = rangeInElement.substring( psiLiteral.getText() );
154+
ElementManipulator<PsiElement> manipulator = getManipulator( psiElement );
155+
TextRange rangeInElement = manipulator.getRangeInElement( psiElement );
156+
String targetValue = rangeInElement.substring( psiElement.getText() );
158157
String[] parts = targetValue.split( "\\." );
159158
if ( parts.length == 0 ) {
160159
return PsiReference.EMPTY_ARRAY;
@@ -171,7 +170,7 @@ static <T extends MapstructBaseReference> PsiReference[] create(PsiLiteral psiLi
171170
nextStart++;
172171
endOffset++;
173172
}
174-
lastReference = creator.create( psiLiteral, lastReference, new TextRange( nextStart, endOffset ) );
173+
lastReference = creator.create( psiElement, lastReference, new TextRange( nextStart, endOffset ) );
175174
nextStart = endOffset;
176175
references[i] = lastReference;
177176
}

src/main/java/org/mapstruct/intellij/codeinsight/references/MapstructSourceReference.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,11 @@
55
*/
66
package org.mapstruct.intellij.codeinsight.references;
77

8-
import java.util.Objects;
9-
import java.util.stream.Stream;
10-
118
import com.intellij.codeInsight.lookup.LookupElement;
129
import com.intellij.openapi.util.TextRange;
1310
import com.intellij.psi.PsiClass;
1411
import com.intellij.psi.PsiElement;
1512
import com.intellij.psi.PsiField;
16-
import com.intellij.psi.PsiLiteral;
1713
import com.intellij.psi.PsiMethod;
1814
import com.intellij.psi.PsiParameter;
1915
import com.intellij.psi.PsiReference;
@@ -24,6 +20,9 @@
2420
import org.jetbrains.annotations.Nullable;
2521
import org.mapstruct.intellij.util.MapstructUtil;
2622

23+
import java.util.Objects;
24+
import java.util.stream.Stream;
25+
2726
import static org.mapstruct.intellij.util.MapstructUtil.asLookup;
2827
import static org.mapstruct.intellij.util.MapstructUtil.isPublicNonStatic;
2928
import static org.mapstruct.intellij.util.SourceUtils.getParameterType;
@@ -43,7 +42,7 @@ class MapstructSourceReference extends MapstructBaseReference {
4342
* @param previousReference the previous reference if there is one (in nested properties for example)
4443
* @param rangeInElement the range that the reference represent in the {@code element}
4544
*/
46-
private MapstructSourceReference(PsiLiteral element, MapstructSourceReference previousReference,
45+
private MapstructSourceReference(PsiElement element, MapstructSourceReference previousReference,
4746
TextRange rangeInElement) {
4847
super( element, previousReference, rangeInElement );
4948
}
@@ -125,12 +124,12 @@ else if ( element instanceof PsiParameter ) {
125124
}
126125

127126
/**
128-
* @param psiLiteral the literal for which references need to be created
127+
* @param psiElement the literal for which references need to be created
129128
*
130129
* @return the references for the given {@code psiLiteral}
131130
*/
132-
static PsiReference[] create(PsiLiteral psiLiteral) {
133-
return MapstructBaseReference.create( psiLiteral, MapstructSourceReference::new );
131+
static PsiReference[] create(PsiElement psiElement) {
132+
return MapstructBaseReference.create( psiElement, MapstructSourceReference::new );
134133
}
135134

136135
private static PsiType memberPsiType(PsiElement psiMember) {

src/main/java/org/mapstruct/intellij/codeinsight/references/MapstructTargetReference.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
import com.intellij.psi.PsiClass;
1515
import com.intellij.psi.PsiElement;
1616
import com.intellij.psi.PsiField;
17-
import com.intellij.psi.PsiLiteral;
1817
import com.intellij.psi.PsiMethod;
1918
import com.intellij.psi.PsiParameter;
2019
import com.intellij.psi.PsiReference;
@@ -50,7 +49,7 @@ class MapstructTargetReference extends MapstructBaseReference {
5049
* @param previousReference the previous reference if there is one (in nested properties for example)
5150
* @param rangeInElement the range that the reference represent in the {@code element}
5251
*/
53-
private MapstructTargetReference(PsiLiteral element, MapstructTargetReference previousReference,
52+
private MapstructTargetReference(PsiElement element, MapstructTargetReference previousReference,
5453
TextRange rangeInElement) {
5554
super( element, previousReference, rangeInElement );
5655
mapStructVersion = MapstructUtil.resolveMapStructProjectVersion( element.getContainingFile()
@@ -154,12 +153,12 @@ else if ( element instanceof PsiParameter ) {
154153
}
155154

156155
/**
157-
* @param psiLiteral the literal for which references need to be created
156+
* @param psiElement the literal for which references need to be created
158157
*
159158
* @return the references for the given {@code psiLiteral}
160159
*/
161-
static PsiReference[] create(PsiLiteral psiLiteral) {
162-
return MapstructBaseReference.create( psiLiteral, MapstructTargetReference::new );
160+
static PsiReference[] create(PsiElement psiElement) {
161+
return MapstructBaseReference.create( psiElement, MapstructTargetReference::new );
163162
}
164163

165164
private static PsiType memberPsiType(PsiElement psiMember) {

0 commit comments

Comments
 (0)