From 49b36cc9422f219479b05af484eb712c21b05240 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Wed, 24 Dec 2014 14:49:46 +0300 Subject: [PATCH] Fixed EA-62981 - IOE: PsiJavaParserFacadeImpl.createExpressionFromText --- .../usageProcessing/FieldToPropertyProcessing.kt | 14 ++++++++++---- ...vaToKotlinConverterForWebDemoTestGenerated.java | 12 ++++++++++++ ...vaToKotlinConverterSingleFileTestGenerated.java | 12 ++++++++++++ .../dropAccessors/JavaKeywordPropertyName.java | 11 +++++++++++ .../dropAccessors/JavaKeywordPropertyName.kt | 7 +++++++ .../dropAccessors/KeywordPropertyName.java | 11 +++++++++++ .../dropAccessors/KeywordPropertyName.kt | 7 +++++++ 7 files changed, 70 insertions(+), 4 deletions(-) create mode 100644 j2k/tests/testData/fileOrElement/dropAccessors/JavaKeywordPropertyName.java create mode 100644 j2k/tests/testData/fileOrElement/dropAccessors/JavaKeywordPropertyName.kt create mode 100644 j2k/tests/testData/fileOrElement/dropAccessors/KeywordPropertyName.java create mode 100644 j2k/tests/testData/fileOrElement/dropAccessors/KeywordPropertyName.kt diff --git a/j2k/src/org/jetbrains/jet/j2k/usageProcessing/FieldToPropertyProcessing.kt b/j2k/src/org/jetbrains/jet/j2k/usageProcessing/FieldToPropertyProcessing.kt index 447fc335d27..2d982e09a9b 100644 --- a/j2k/src/org/jetbrains/jet/j2k/usageProcessing/FieldToPropertyProcessing.kt +++ b/j2k/src/org/jetbrains/jet/j2k/usageProcessing/FieldToPropertyProcessing.kt @@ -19,6 +19,7 @@ package org.jetbrains.jet.j2k.usageProcessing import com.intellij.psi.* import org.jetbrains.jet.j2k.CodeConverter import org.jetbrains.jet.j2k.ast.* +import com.intellij.util.IncorrectOperationException class FieldToPropertyProcessing(val field: PsiField, val propertyName: String, val isNullable: Boolean) : UsageProcessing { override val targetElement: PsiElement get() = field @@ -29,14 +30,19 @@ class FieldToPropertyProcessing(val field: PsiField, val propertyName: String, v val identifier = Identifier(propertyName, isNullable).assignNoPrototype() val qualifier = expression.getQualifierExpression() - return if (qualifier != null) { - QualifiedExpression(codeConverter.convertExpression(qualifier), identifier) + if (qualifier != null) { + return QualifiedExpression(codeConverter.convertExpression(qualifier), identifier) } else { // check if field name is shadowed val elementFactory = PsiElementFactory.SERVICE.getInstance(expression.getProject()) - val refExpr = elementFactory.createExpressionFromText(propertyName, expression) as PsiReferenceExpression - if (refExpr.resolve() == null) + val refExpr = try { + elementFactory.createExpressionFromText(propertyName, expression) as? PsiReferenceExpression ?: return identifier + } + catch(e: IncorrectOperationException) { + return identifier + } + return if (refExpr.resolve() == null) identifier else QualifiedExpression(ThisExpression(Identifier.Empty).assignNoPrototype(), identifier) //TODO: this is not correct in case of nested/anonymous classes diff --git a/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterForWebDemoTestGenerated.java b/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterForWebDemoTestGenerated.java index afbe0a81e7f..c23ff1e26d9 100644 --- a/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterForWebDemoTestGenerated.java +++ b/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterForWebDemoTestGenerated.java @@ -1419,6 +1419,18 @@ public class JavaToKotlinConverterForWebDemoTestGenerated extends AbstractJavaTo doTest(fileName); } + @TestMetadata("JavaKeywordPropertyName.java") + public void testJavaKeywordPropertyName() throws Exception { + String fileName = JetTestUtils.navigationMetadata("j2k/tests/testData/fileOrElement/dropAccessors/JavaKeywordPropertyName.java"); + doTest(fileName); + } + + @TestMetadata("KeywordPropertyName.java") + public void testKeywordPropertyName() throws Exception { + String fileName = JetTestUtils.navigationMetadata("j2k/tests/testData/fileOrElement/dropAccessors/KeywordPropertyName.java"); + doTest(fileName); + } + @TestMetadata("SetterTypeNotMatch.java") public void testSetterTypeNotMatch() throws Exception { String fileName = JetTestUtils.navigationMetadata("j2k/tests/testData/fileOrElement/dropAccessors/SetterTypeNotMatch.java"); diff --git a/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterSingleFileTestGenerated.java b/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterSingleFileTestGenerated.java index ab23ce16666..c7d9cf9c745 100644 --- a/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterSingleFileTestGenerated.java +++ b/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterSingleFileTestGenerated.java @@ -1419,6 +1419,18 @@ public class JavaToKotlinConverterSingleFileTestGenerated extends AbstractJavaTo doTest(fileName); } + @TestMetadata("JavaKeywordPropertyName.java") + public void testJavaKeywordPropertyName() throws Exception { + String fileName = JetTestUtils.navigationMetadata("j2k/tests/testData/fileOrElement/dropAccessors/JavaKeywordPropertyName.java"); + doTest(fileName); + } + + @TestMetadata("KeywordPropertyName.java") + public void testKeywordPropertyName() throws Exception { + String fileName = JetTestUtils.navigationMetadata("j2k/tests/testData/fileOrElement/dropAccessors/KeywordPropertyName.java"); + doTest(fileName); + } + @TestMetadata("SetterTypeNotMatch.java") public void testSetterTypeNotMatch() throws Exception { String fileName = JetTestUtils.navigationMetadata("j2k/tests/testData/fileOrElement/dropAccessors/SetterTypeNotMatch.java"); diff --git a/j2k/tests/testData/fileOrElement/dropAccessors/JavaKeywordPropertyName.java b/j2k/tests/testData/fileOrElement/dropAccessors/JavaKeywordPropertyName.java new file mode 100644 index 00000000000..91fee573f4a --- /dev/null +++ b/j2k/tests/testData/fileOrElement/dropAccessors/JavaKeywordPropertyName.java @@ -0,0 +1,11 @@ +class C { + private int field = 0; + + public int getDefault() { + return field; + } + + void foo() { + System.out.println(field); + } +} \ No newline at end of file diff --git a/j2k/tests/testData/fileOrElement/dropAccessors/JavaKeywordPropertyName.kt b/j2k/tests/testData/fileOrElement/dropAccessors/JavaKeywordPropertyName.kt new file mode 100644 index 00000000000..a597f9cb32e --- /dev/null +++ b/j2k/tests/testData/fileOrElement/dropAccessors/JavaKeywordPropertyName.kt @@ -0,0 +1,7 @@ +class C { + public val default: Int = 0 + + fun foo() { + System.out.println(default) + } +} diff --git a/j2k/tests/testData/fileOrElement/dropAccessors/KeywordPropertyName.java b/j2k/tests/testData/fileOrElement/dropAccessors/KeywordPropertyName.java new file mode 100644 index 00000000000..de1d19b5482 --- /dev/null +++ b/j2k/tests/testData/fileOrElement/dropAccessors/KeywordPropertyName.java @@ -0,0 +1,11 @@ +class C { + private int field = 0; + + public int getThis() { + return field; + } + + void foo() { + System.out.println(field); + } +} \ No newline at end of file diff --git a/j2k/tests/testData/fileOrElement/dropAccessors/KeywordPropertyName.kt b/j2k/tests/testData/fileOrElement/dropAccessors/KeywordPropertyName.kt new file mode 100644 index 00000000000..d34c5328537 --- /dev/null +++ b/j2k/tests/testData/fileOrElement/dropAccessors/KeywordPropertyName.kt @@ -0,0 +1,7 @@ +class C { + public val `this`: Int = 0 + + fun foo() { + System.out.println(`this`) + } +} \ No newline at end of file