Drop undocumented absolute name specification feature with 'package.'

This commit is contained in:
Alexander Udalov
2016-05-30 14:24:11 +03:00
parent 9f819b1c03
commit 1339286261
14 changed files with 22 additions and 64 deletions
@@ -106,7 +106,6 @@ public class KotlinExpressionParsing extends AbstractKotlinParsing {
IDENTIFIER, // SimpleName IDENTIFIER, // SimpleName
PACKAGE_KEYWORD, // for absolute qualified names
AT // Just for better recovery and maybe for annotations AT // Just for better recovery and maybe for annotations
); );
@@ -23,7 +23,6 @@ import com.intellij.psi.tree.IElementType;
import com.intellij.psi.tree.TokenSet; import com.intellij.psi.tree.TokenSet;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.KtNodeType;
import org.jetbrains.kotlin.lexer.KtKeywordToken; import org.jetbrains.kotlin.lexer.KtKeywordToken;
import org.jetbrains.kotlin.lexer.KtTokens; import org.jetbrains.kotlin.lexer.KtTokens;
@@ -1939,7 +1938,7 @@ public class KotlinParsing extends AbstractKotlinParsing {
/* /*
* userType * userType
* : ("package" ".")? simpleUserType{"."} * : simpleUserType{"."}
* ; * ;
* *
* recovers on platform types: * recovers on platform types:
@@ -1951,7 +1950,9 @@ public class KotlinParsing extends AbstractKotlinParsing {
PsiBuilder.Marker userType = mark(); PsiBuilder.Marker userType = mark();
if (at(PACKAGE_KEYWORD)) { if (at(PACKAGE_KEYWORD)) {
PsiBuilder.Marker keyword = mark();
advance(); // PACKAGE_KEYWORD advance(); // PACKAGE_KEYWORD
keyword.error("Expecting an element");
expect(DOT, "Expecting '.'", TokenSet.create(IDENTIFIER, LBRACE, RBRACE)); expect(DOT, "Expecting '.'", TokenSet.create(IDENTIFIER, LBRACE, RBRACE));
} }
@@ -43,15 +43,8 @@ public class KtImportDirective extends KtElementImplStub<KotlinImportDirectiveSt
return visitor.visitImportDirective(this, data); return visitor.visitImportDirective(this, data);
} }
public boolean isAbsoluteInRootPackage() { @Nullable
KotlinImportDirectiveStub stub = getStub(); @IfNotParsed
if (stub != null) {
return stub.isAbsoluteInRootPackage();
}
return findChildByType(KtTokens.PACKAGE_KEYWORD) != null;
}
@Nullable @IfNotParsed
public KtExpression getImportedReference() { public KtExpression getImportedReference() {
KtExpression[] references = getStubOrPsiChildren(KtStubElementTypes.INSIDE_DIRECTIVE_EXPRESSIONS, KtExpression.ARRAY_FACTORY); KtExpression[] references = getStubOrPsiChildren(KtStubElementTypes.INSIDE_DIRECTIVE_EXPRESSIONS, KtExpression.ARRAY_FACTORY);
if (references.length > 0) { if (references.length > 0) {
@@ -37,14 +37,6 @@ public class KtUserType extends KtElementImplStub<KotlinUserTypeStub> implements
super(stub, KtStubElementTypes.USER_TYPE); super(stub, KtStubElementTypes.USER_TYPE);
} }
public boolean isAbsoluteInRootPackage() {
KotlinUserTypeStub stub = getStub();
if (stub != null) {
return stub.isAbsoluteInRootPackage();
}
return findChildByType(KtTokens.PACKAGE_KEYWORD) != null;
}
@Override @Override
public <R, D> R accept(@NotNull KtVisitor<R, D> visitor, D data) { public <R, D> R accept(@NotNull KtVisitor<R, D> visitor, D data) {
return visitor.visitUserType(this, data); return visitor.visitUserType(this, data);
@@ -83,15 +75,6 @@ public class KtUserType extends KtElementImplStub<KotlinUserTypeStub> implements
return getStubOrPsiChild(KtStubElementTypes.USER_TYPE); return getStubOrPsiChild(KtStubElementTypes.USER_TYPE);
} }
public boolean hasTypesWithTypeArgsInside() {
for (KtUserType type : getStubOrPsiChildrenAsList(KtStubElementTypes.USER_TYPE)) {
if (!type.getTypeArguments().isEmpty() || type.hasTypesWithTypeArgsInside()) {
return true;
}
}
return false;
}
public void deleteQualifier() { public void deleteQualifier() {
KtUserType qualifier = getQualifier(); KtUserType qualifier = getQualifier();
assert qualifier != null; assert qualifier != null;
@@ -39,7 +39,7 @@ public class KtImportDirectiveElementType extends KtStubElementType<KotlinImport
FqName importedFqName = psi.getImportedFqName(); FqName importedFqName = psi.getImportedFqName();
StringRef fqName = StringRef.fromString(importedFqName == null ? null : importedFqName.asString()); StringRef fqName = StringRef.fromString(importedFqName == null ? null : importedFqName.asString());
StringRef aliasName = StringRef.fromString(psi.getAliasName()); StringRef aliasName = StringRef.fromString(psi.getAliasName());
return new KotlinImportDirectiveStubImpl(parentStub, psi.isAbsoluteInRootPackage(), psi.isAllUnder(), return new KotlinImportDirectiveStubImpl(parentStub, false /* TODO: drop */, psi.isAllUnder(),
fqName, aliasName, psi.isValidImport()); fqName, aliasName, psi.isValidImport());
} }
@@ -34,7 +34,7 @@ public class KtUserTypeElementType extends KtStubElementType<KotlinUserTypeStub,
@Override @Override
public KotlinUserTypeStub createStub(@NotNull KtUserType psi, StubElement parentStub) { public KotlinUserTypeStub createStub(@NotNull KtUserType psi, StubElement parentStub) {
return new KotlinUserTypeStubImpl(parentStub, psi.isAbsoluteInRootPackage()); return new KotlinUserTypeStubImpl(parentStub, false /* TODO: drop */);
} }
@Override @Override
@@ -70,7 +70,7 @@ class QualifiedExpressionResolver(val symbolUsageValidator: SymbolUsageValidator
isDebuggerContext: Boolean isDebuggerContext: Boolean
): TypeQualifierResolutionResult { ): TypeQualifierResolutionResult {
val ownerDescriptor = if (!isDebuggerContext) scope.ownerDescriptor else null val ownerDescriptor = if (!isDebuggerContext) scope.ownerDescriptor else null
if (userType.qualifier == null && !userType.startWithPackage) { if (userType.qualifier == null) {
val descriptor = userType.referenceExpression?.let { val descriptor = userType.referenceExpression?.let {
val classifier = scope.findClassifier(it.getReferencedNameAsName(), KotlinLookupLocation(it)) val classifier = scope.findClassifier(it.getReferencedNameAsName(), KotlinLookupLocation(it))
storeResult(trace, it, classifier, ownerDescriptor, position = QualifierPosition.TYPE, isQualifier = false) storeResult(trace, it, classifier, ownerDescriptor, position = QualifierPosition.TYPE, isQualifier = false)
@@ -80,32 +80,29 @@ class QualifiedExpressionResolver(val symbolUsageValidator: SymbolUsageValidator
return TypeQualifierResolutionResult(userType.asQualifierPartList().first, descriptor) return TypeQualifierResolutionResult(userType.asQualifierPartList().first, descriptor)
} }
val module = scope.ownerDescriptor.module
val (qualifierPartList, hasError) = userType.asQualifierPartList() val (qualifierPartList, hasError) = userType.asQualifierPartList()
if (hasError) { if (hasError) {
val descriptor = resolveToPackageOrClass( val descriptor = resolveToPackageOrClass(
qualifierPartList, module, trace, ownerDescriptor, scope, position = QualifierPosition.TYPE qualifierPartList, scope.ownerDescriptor.module, trace, ownerDescriptor, scope, position = QualifierPosition.TYPE
) as? ClassifierDescriptor ) as? ClassifierDescriptor
return TypeQualifierResolutionResult(qualifierPartList, descriptor) return TypeQualifierResolutionResult(qualifierPartList, descriptor)
} }
return resolveQualifierPartListForType( return resolveQualifierPartListForType(qualifierPartList, ownerDescriptor, scope, trace, isQualifier = false)
qualifierPartList, ownerDescriptor, module, scope.check { !userType.startWithPackage }, trace, isQualifier = false
)
} }
private fun resolveQualifierPartListForType( private fun resolveQualifierPartListForType(
qualifierPartList: List<QualifierPart>, qualifierPartList: List<QualifierPart>,
ownerDescriptor: DeclarationDescriptor?, ownerDescriptor: DeclarationDescriptor?,
module: ModuleDescriptor, scope: LexicalScope,
scope: LexicalScope?,
trace: BindingTrace, trace: BindingTrace,
isQualifier: Boolean isQualifier: Boolean
): TypeQualifierResolutionResult { ): TypeQualifierResolutionResult {
assert(qualifierPartList.isNotEmpty()) { "Qualifier list should not be empty" } assert(qualifierPartList.isNotEmpty()) { "Qualifier list should not be empty" }
val qualifier = resolveToPackageOrClass( val qualifier = resolveToPackageOrClass(
qualifierPartList.subList(0, qualifierPartList.size - 1), module, trace, ownerDescriptor, scope, qualifierPartList.subList(0, qualifierPartList.size - 1),
scope.ownerDescriptor.module, trace, ownerDescriptor, scope,
position = QualifierPosition.TYPE position = QualifierPosition.TYPE
) ?: return TypeQualifierResolutionResult(qualifierPartList, null) ) ?: return TypeQualifierResolutionResult(qualifierPartList, null)
@@ -140,21 +137,9 @@ class QualifiedExpressionResolver(val symbolUsageValidator: SymbolUsageValidator
return TypeQualifierResolutionResult(qualifierPartList, descriptor) return TypeQualifierResolutionResult(qualifierPartList, descriptor)
} }
return resolveQualifierPartListForType( return resolveQualifierPartListForType(qualifierPartList, ownerDescriptor, scope, trace, isQualifier = true)
qualifierPartList, ownerDescriptor, scope.ownerDescriptor.module, scope, trace, isQualifier = true
)
} }
private val KtUserType.startWithPackage: Boolean
get() {
var firstPart = this
while (firstPart.qualifier != null) {
firstPart = firstPart.qualifier!!
}
return firstPart.isAbsoluteInRootPackage
}
private fun KtUserType.asQualifierPartList(): Pair<List<QualifierPart>, Boolean> { private fun KtUserType.asQualifierPartList(): Pair<List<QualifierPart>, Boolean> {
var hasError = false var hasError = false
val result = SmartList<QualifierPart>() val result = SmartList<QualifierPart>()
@@ -28,9 +28,6 @@ fun Any?.vars(<!UNUSED_PARAMETER!>a<!>: Any?) : Int {
if (example.ns.y is Int) { if (example.ns.y is Int) {
<!UNUSED_VALUE!>b =<!> <!DEBUG_INFO_SMARTCAST!>example.ns.y<!> <!UNUSED_VALUE!>b =<!> <!DEBUG_INFO_SMARTCAST!>example.ns.y<!>
} }
// if (package.bottles.ns.y is Int) {
// b = ns.y
// }
if (Obj.y is Int) { if (Obj.y is Int) {
<!UNUSED_VALUE!>b =<!> <!DEBUG_INFO_SMARTCAST!>Obj.y<!> <!UNUSED_VALUE!>b =<!> <!DEBUG_INFO_SMARTCAST!>Obj.y<!>
} }
+2 -1
View File
@@ -359,7 +359,8 @@ JetFile: When.kt
TYPE_REFERENCE TYPE_REFERENCE
USER_TYPE USER_TYPE
USER_TYPE USER_TYPE
PsiElement(package)('package') PsiErrorElement:Expecting an element
PsiElement(package)('package')
PsiElement(DOT)('.') PsiElement(DOT)('.')
REFERENCE_EXPRESSION REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('a') PsiElement(IDENTIFIER)('a')
@@ -74,7 +74,8 @@ JetFile: functionTypes.kt
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
TYPE_REFERENCE TYPE_REFERENCE
USER_TYPE USER_TYPE
PsiElement(package)('package') PsiErrorElement:Expecting an element
PsiElement(package)('package')
PsiElement(DOT)('.') PsiElement(DOT)('.')
REFERENCE_EXPRESSION REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('Int') PsiElement(IDENTIFIER)('Int')
@@ -22,7 +22,8 @@ JetFile: IncompleteTypeRefWithPackageKeyword.kt
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
TYPE_REFERENCE TYPE_REFERENCE
USER_TYPE USER_TYPE
PsiElement(package)('package') PsiErrorElement:Expecting an element
PsiElement(package)('package')
PsiErrorElement:Expecting '.' PsiErrorElement:Expecting '.'
<empty list> <empty list>
PsiWhiteSpace('\n') PsiWhiteSpace('\n')
-1
View File
@@ -122,7 +122,6 @@ atomicExpression
: loop : loop
: SimpleName : SimpleName
: FieldName : FieldName
: "package" // for the root package
; ;
labelReference labelReference
+1 -1
View File
@@ -36,7 +36,7 @@ selfType
*/ */
userType userType
: ("package" ".")? simpleUserType{"."} : simpleUserType{"."}
; ;
simpleUserType simpleUserType
@@ -2,6 +2,4 @@ fun foo() {
val test : <caret> val test : <caret>
} }
/*TODO: Is 'package' type qualifier syntax correct?*/
// EXIST: package
// NOTHING_ELSE // NOTHING_ELSE