don't use project scope to resolve java.lang.String (#KT-25024)

This commit is contained in:
Nicolay Mitropolsky
2018-06-21 20:17:24 +03:00
parent cdfb813f2e
commit 01e9dd5085
6 changed files with 29 additions and 13 deletions
@@ -10,7 +10,6 @@ import com.intellij.psi.*
import com.intellij.psi.impl.LanguageConstantExpressionEvaluator import com.intellij.psi.impl.LanguageConstantExpressionEvaluator
import com.intellij.psi.impl.light.LightIdentifier import com.intellij.psi.impl.light.LightIdentifier
import com.intellij.psi.impl.light.LightTypeElement import com.intellij.psi.impl.light.LightTypeElement
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.asJava.LightClassGenerationSupport import org.jetbrains.kotlin.asJava.LightClassGenerationSupport
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingContext
@@ -83,7 +82,7 @@ private fun psiType(kotlinType: KotlinType, context: PsiElement): PsiType? {
"kotlin.Char" -> PsiType.CHAR "kotlin.Char" -> PsiType.CHAR
"kotlin.Double" -> PsiType.DOUBLE "kotlin.Double" -> PsiType.DOUBLE
"kotlin.Float" -> PsiType.FLOAT "kotlin.Float" -> PsiType.FLOAT
"kotlin.String" -> PsiType.getJavaLangString(context.manager, GlobalSearchScope.projectScope(context.project)) "kotlin.String" -> PsiType.getJavaLangString(context.manager, context.resolveScope)
else -> PsiType.getTypeByName(typeFqName, context.project, context.resolveScope) else -> PsiType.getTypeByName(typeFqName, context.project, context.resolveScope)
} }
} }
@@ -10,7 +10,6 @@ import com.intellij.psi.*
import com.intellij.psi.impl.LanguageConstantExpressionEvaluator import com.intellij.psi.impl.LanguageConstantExpressionEvaluator
import com.intellij.psi.impl.light.LightIdentifier import com.intellij.psi.impl.light.LightIdentifier
import com.intellij.psi.impl.light.LightTypeElement import com.intellij.psi.impl.light.LightTypeElement
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.asJava.LightClassGenerationSupport import org.jetbrains.kotlin.asJava.LightClassGenerationSupport
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingContext
@@ -83,7 +82,7 @@ private fun psiType(kotlinType: KotlinType, context: PsiElement): PsiType? {
"kotlin.Char" -> PsiType.CHAR "kotlin.Char" -> PsiType.CHAR
"kotlin.Double" -> PsiType.DOUBLE "kotlin.Double" -> PsiType.DOUBLE
"kotlin.Float" -> PsiType.FLOAT "kotlin.Float" -> PsiType.FLOAT
"kotlin.String" -> PsiType.getJavaLangString(context.manager, GlobalSearchScope.projectScope(context.project)) "kotlin.String" -> PsiType.getJavaLangString(context.manager, context.resolveScope)
else -> PsiType.getTypeByName(typeFqName, context.project, context.resolveScope) else -> PsiType.getTypeByName(typeFqName, context.project, context.resolveScope)
} }
} }
@@ -30,7 +30,6 @@ import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.idea.completion.test.assertInstanceOf import org.jetbrains.kotlin.idea.completion.test.assertInstanceOf
import org.jetbrains.kotlin.idea.facet.configureFacet import org.jetbrains.kotlin.idea.facet.configureFacet
import org.jetbrains.kotlin.idea.facet.getOrCreateFacet import org.jetbrains.kotlin.idea.facet.getOrCreateFacet
import org.jetbrains.kotlin.idea.search.projectScope
import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase
import org.jetbrains.kotlin.idea.test.KotlinWithJdkAndRuntimeLightProjectDescriptor import org.jetbrains.kotlin.idea.test.KotlinWithJdkAndRuntimeLightProjectDescriptor
@@ -85,7 +84,10 @@ class KtLightAnnotationTest : KotlinLightCodeInsightFixtureTestCase() {
.expectAnnotations(2).single { it.qualifiedName == "Qualifier" } .expectAnnotations(2).single { it.qualifiedName == "Qualifier" }
val annotationAttributeVal = annotation.findAttributeValue("value") as PsiExpression val annotationAttributeVal = annotation.findAttributeValue("value") as PsiExpression
assertTextRangeAndValue("\"foo\"", "foo", annotationAttributeVal) assertTextRangeAndValue("\"foo\"", "foo", annotationAttributeVal)
TestCase.assertEquals(PsiType.getJavaLangString(psiManager, GlobalSearchScope.projectScope(project)), annotationAttributeVal.type) TestCase.assertEquals(
PsiType.getJavaLangString(psiManager, GlobalSearchScope.everythingScope(project)),
annotationAttributeVal.type
)
} }
fun testAnnotationsInAnnotationsDeclarations() { fun testAnnotationsInAnnotationsDeclarations() {
@@ -139,7 +141,7 @@ class KtLightAnnotationTest : KotlinLightCodeInsightFixtureTestCase() {
assertTextAndRange("Constants.MY_CONSTANT", annotationAttributeVal) assertTextAndRange("Constants.MY_CONSTANT", annotationAttributeVal)
TestCase.assertEquals("67", annotationAttributeVal.value) TestCase.assertEquals("67", annotationAttributeVal.value)
TestCase.assertEquals( TestCase.assertEquals(
PsiType.getJavaLangString(psiManager, GlobalSearchScope.projectScope(project)), PsiType.getJavaLangString(psiManager, GlobalSearchScope.everythingScope(project)),
(annotationAttributeVal as PsiExpression).type (annotationAttributeVal as PsiExpression).type
) )
} }
@@ -230,7 +232,7 @@ class KtLightAnnotationTest : KotlinLightCodeInsightFixtureTestCase() {
val annotationAttributeVal = annotations.first().findAttributeValue("cls") as PsiClassObjectAccessExpression val annotationAttributeVal = annotations.first().findAttributeValue("cls") as PsiClassObjectAccessExpression
assertTextAndRange("String::class", annotationAttributeVal) assertTextAndRange("String::class", annotationAttributeVal)
TestCase.assertEquals( TestCase.assertEquals(
PsiType.getJavaLangString(myFixture.psiManager, myFixture.project.projectScope()), PsiType.getJavaLangString(myFixture.psiManager, GlobalSearchScope.everythingScope(project)),
annotationAttributeVal.operand.type annotationAttributeVal.operand.type
) )
} }
@@ -86,7 +86,10 @@ class KtLightAnnotationTest : KotlinLightCodeInsightFixtureTestCase() {
val annotationAttributeVal = annotation.findAttributeValue("value") as PsiExpression val annotationAttributeVal = annotation.findAttributeValue("value") as PsiExpression
TestCase.assertTrue(annotationAttributeVal.isPhysical) TestCase.assertTrue(annotationAttributeVal.isPhysical)
assertTextRangeAndValue("\"foo\"", "foo", annotationAttributeVal) assertTextRangeAndValue("\"foo\"", "foo", annotationAttributeVal)
TestCase.assertEquals(PsiType.getJavaLangString(psiManager, GlobalSearchScope.projectScope(project)), annotationAttributeVal.type) TestCase.assertEquals(
PsiType.getJavaLangString(psiManager, GlobalSearchScope.everythingScope(project)),
annotationAttributeVal.type
)
} }
fun testAnnotationsInAnnotationsDeclarations() { fun testAnnotationsInAnnotationsDeclarations() {
@@ -140,7 +143,7 @@ class KtLightAnnotationTest : KotlinLightCodeInsightFixtureTestCase() {
assertTextAndRange("Constants.MY_CONSTANT", annotationAttributeVal) assertTextAndRange("Constants.MY_CONSTANT", annotationAttributeVal)
TestCase.assertEquals("67", annotationAttributeVal.value) TestCase.assertEquals("67", annotationAttributeVal.value)
TestCase.assertEquals( TestCase.assertEquals(
PsiType.getJavaLangString(psiManager, GlobalSearchScope.projectScope(project)), PsiType.getJavaLangString(psiManager, GlobalSearchScope.everythingScope(project)),
(annotationAttributeVal as PsiExpression).type (annotationAttributeVal as PsiExpression).type
) )
} }
@@ -231,7 +234,7 @@ class KtLightAnnotationTest : KotlinLightCodeInsightFixtureTestCase() {
val annotationAttributeVal = annotations.first().findAttributeValue("cls") as PsiClassObjectAccessExpression val annotationAttributeVal = annotations.first().findAttributeValue("cls") as PsiClassObjectAccessExpression
assertTextAndRange("String::class", annotationAttributeVal) assertTextAndRange("String::class", annotationAttributeVal)
TestCase.assertEquals( TestCase.assertEquals(
PsiType.getJavaLangString(myFixture.psiManager, myFixture.project.projectScope()), PsiType.getJavaLangString(myFixture.psiManager, GlobalSearchScope.everythingScope(project)),
annotationAttributeVal.operand.type annotationAttributeVal.operand.type
) )
} }
@@ -24,7 +24,6 @@ import com.intellij.psi.impl.cache.TypeInfo
import com.intellij.psi.impl.compiled.ClsTypeElementImpl import com.intellij.psi.impl.compiled.ClsTypeElementImpl
import com.intellij.psi.impl.compiled.SignatureParsing import com.intellij.psi.impl.compiled.SignatureParsing
import com.intellij.psi.impl.compiled.StubBuildingVisitor import com.intellij.psi.impl.compiled.StubBuildingVisitor
import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.util.PsiTypesUtil import com.intellij.psi.util.PsiTypesUtil
import org.jetbrains.kotlin.asJava.LightClassUtil import org.jetbrains.kotlin.asJava.LightClassUtil
import org.jetbrains.kotlin.asJava.elements.FakeFileForLightClass import org.jetbrains.kotlin.asJava.elements.FakeFileForLightClass
@@ -181,7 +180,7 @@ internal fun KotlinType.toPsiType(lightDeclaration: PsiModifierListOwner?, conte
"kotlin.Char" -> PsiType.CHAR.orBoxed() "kotlin.Char" -> PsiType.CHAR.orBoxed()
"kotlin.Double" -> PsiType.DOUBLE.orBoxed() "kotlin.Double" -> PsiType.DOUBLE.orBoxed()
"kotlin.Float" -> PsiType.FLOAT.orBoxed() "kotlin.Float" -> PsiType.FLOAT.orBoxed()
"kotlin.String" -> PsiType.getJavaLangString(context.manager, GlobalSearchScope.projectScope(context.project)) "kotlin.String" -> PsiType.getJavaLangString(context.manager, context.resolveScope)
else -> { else -> {
val typeConstructor = this.constructor val typeConstructor = this.constructor
if (typeConstructor is IntegerValueTypeConstructor) { if (typeConstructor is IntegerValueTypeConstructor) {
@@ -16,6 +16,7 @@
package org.jetbrains.uast.test.kotlin package org.jetbrains.uast.test.kotlin
import com.intellij.psi.PsiClassType
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile import com.intellij.psi.PsiFile
import com.intellij.psi.PsiLanguageInjectionHost import com.intellij.psi.PsiLanguageInjectionHost
@@ -130,6 +131,19 @@ class KotlinDetachedUastTest : KotlinLightCodeInsightFixtureTestCase() {
} }
fun testResolveStringFromUast() {
val file = myFixture.addFileToProject(
"s.kt", """fun foo(){
val s = "abc"
s.toUpperCase()
}
""${'"'}"""
)
val refs = file.findUElementByTextFromPsi<UQualifiedReferenceExpression>("s.toUpperCase()")
TestCase.assertNotNull((refs.receiver.getExpressionType() as PsiClassType).resolve())
}
} }
fun <T> T?.orFail(msg: String): T = this ?: error(msg) fun <T> T?.orFail(msg: String): T = this ?: error(msg)