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.light.LightIdentifier
import com.intellij.psi.impl.light.LightTypeElement
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.asJava.LightClassGenerationSupport
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.resolve.BindingContext
@@ -83,7 +82,7 @@ private fun psiType(kotlinType: KotlinType, context: PsiElement): PsiType? {
"kotlin.Char" -> PsiType.CHAR
"kotlin.Double" -> PsiType.DOUBLE
"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)
}
}
@@ -10,7 +10,6 @@ import com.intellij.psi.*
import com.intellij.psi.impl.LanguageConstantExpressionEvaluator
import com.intellij.psi.impl.light.LightIdentifier
import com.intellij.psi.impl.light.LightTypeElement
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.asJava.LightClassGenerationSupport
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.resolve.BindingContext
@@ -83,7 +82,7 @@ private fun psiType(kotlinType: KotlinType, context: PsiElement): PsiType? {
"kotlin.Char" -> PsiType.CHAR
"kotlin.Double" -> PsiType.DOUBLE
"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)
}
}
@@ -30,7 +30,6 @@ import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.idea.completion.test.assertInstanceOf
import org.jetbrains.kotlin.idea.facet.configureFacet
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.KotlinWithJdkAndRuntimeLightProjectDescriptor
@@ -85,7 +84,10 @@ class KtLightAnnotationTest : KotlinLightCodeInsightFixtureTestCase() {
.expectAnnotations(2).single { it.qualifiedName == "Qualifier" }
val annotationAttributeVal = annotation.findAttributeValue("value") as PsiExpression
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() {
@@ -139,7 +141,7 @@ class KtLightAnnotationTest : KotlinLightCodeInsightFixtureTestCase() {
assertTextAndRange("Constants.MY_CONSTANT", annotationAttributeVal)
TestCase.assertEquals("67", annotationAttributeVal.value)
TestCase.assertEquals(
PsiType.getJavaLangString(psiManager, GlobalSearchScope.projectScope(project)),
PsiType.getJavaLangString(psiManager, GlobalSearchScope.everythingScope(project)),
(annotationAttributeVal as PsiExpression).type
)
}
@@ -230,7 +232,7 @@ class KtLightAnnotationTest : KotlinLightCodeInsightFixtureTestCase() {
val annotationAttributeVal = annotations.first().findAttributeValue("cls") as PsiClassObjectAccessExpression
assertTextAndRange("String::class", annotationAttributeVal)
TestCase.assertEquals(
PsiType.getJavaLangString(myFixture.psiManager, myFixture.project.projectScope()),
PsiType.getJavaLangString(myFixture.psiManager, GlobalSearchScope.everythingScope(project)),
annotationAttributeVal.operand.type
)
}
@@ -86,7 +86,10 @@ class KtLightAnnotationTest : KotlinLightCodeInsightFixtureTestCase() {
val annotationAttributeVal = annotation.findAttributeValue("value") as PsiExpression
TestCase.assertTrue(annotationAttributeVal.isPhysical)
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() {
@@ -140,7 +143,7 @@ class KtLightAnnotationTest : KotlinLightCodeInsightFixtureTestCase() {
assertTextAndRange("Constants.MY_CONSTANT", annotationAttributeVal)
TestCase.assertEquals("67", annotationAttributeVal.value)
TestCase.assertEquals(
PsiType.getJavaLangString(psiManager, GlobalSearchScope.projectScope(project)),
PsiType.getJavaLangString(psiManager, GlobalSearchScope.everythingScope(project)),
(annotationAttributeVal as PsiExpression).type
)
}
@@ -231,7 +234,7 @@ class KtLightAnnotationTest : KotlinLightCodeInsightFixtureTestCase() {
val annotationAttributeVal = annotations.first().findAttributeValue("cls") as PsiClassObjectAccessExpression
assertTextAndRange("String::class", annotationAttributeVal)
TestCase.assertEquals(
PsiType.getJavaLangString(myFixture.psiManager, myFixture.project.projectScope()),
PsiType.getJavaLangString(myFixture.psiManager, GlobalSearchScope.everythingScope(project)),
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.SignatureParsing
import com.intellij.psi.impl.compiled.StubBuildingVisitor
import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.util.PsiTypesUtil
import org.jetbrains.kotlin.asJava.LightClassUtil
import org.jetbrains.kotlin.asJava.elements.FakeFileForLightClass
@@ -181,7 +180,7 @@ internal fun KotlinType.toPsiType(lightDeclaration: PsiModifierListOwner?, conte
"kotlin.Char" -> PsiType.CHAR.orBoxed()
"kotlin.Double" -> PsiType.DOUBLE.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 -> {
val typeConstructor = this.constructor
if (typeConstructor is IntegerValueTypeConstructor) {
@@ -16,6 +16,7 @@
package org.jetbrains.uast.test.kotlin
import com.intellij.psi.PsiClassType
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile
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)