Parser: Do not produce qualified expressions without receiver in package directives. Add assertion on JetQualifiedExpression
#KT-6907 Fixed
This commit is contained in:
@@ -228,8 +228,16 @@ public class JetParsing extends AbstractJetParsing {
|
||||
break;
|
||||
}
|
||||
|
||||
if (at(DOT)) {
|
||||
advance(); // DOT
|
||||
qualifiedExpression.error("Package name must be a '.'-separated identifier list");
|
||||
qualifiedExpression = mark();
|
||||
continue;
|
||||
}
|
||||
|
||||
PsiBuilder.Marker nsName = mark();
|
||||
if (expect(IDENTIFIER, "Package name must be a '.'-separated identifier list", PACKAGE_NAME_RECOVERY_SET)) {
|
||||
boolean simpleNameFound = expect(IDENTIFIER, "Package name must be a '.'-separated identifier list", PACKAGE_NAME_RECOVERY_SET);
|
||||
if (simpleNameFound) {
|
||||
nsName.done(REFERENCE_EXPRESSION);
|
||||
}
|
||||
else {
|
||||
@@ -243,8 +251,15 @@ public class JetParsing extends AbstractJetParsing {
|
||||
}
|
||||
|
||||
if (at(DOT)) {
|
||||
simpleName = false;
|
||||
advance(); // DOT
|
||||
|
||||
if (simpleName && !simpleNameFound) {
|
||||
qualifiedExpression.drop();
|
||||
qualifiedExpression = mark();
|
||||
}
|
||||
else {
|
||||
simpleName = false;
|
||||
}
|
||||
}
|
||||
else {
|
||||
break;
|
||||
|
||||
@@ -20,6 +20,7 @@ import com.intellij.lang.ASTNode
|
||||
import org.jetbrains.kotlin.lexer.JetToken
|
||||
import org.jetbrains.kotlin.lexer.JetTokens
|
||||
import com.intellij.psi.util.PsiTreeUtil
|
||||
import org.jetbrains.kotlin.psi.psiUtil.*
|
||||
|
||||
object JetQualifiedExpressionImpl {
|
||||
public fun JetQualifiedExpression.getOperationTokenNode(): ASTNode {
|
||||
@@ -31,20 +32,15 @@ object JetQualifiedExpressionImpl {
|
||||
return this.getOperationTokenNode().getElementType() as JetToken
|
||||
}
|
||||
|
||||
private fun JetQualifiedExpression.getExpression(afterOperation: Boolean): JetExpression? {
|
||||
return getOperationTokenNode()?.getPsi()?.siblings(afterOperation, false)?.firstOrNull { it is JetExpression } as? JetExpression
|
||||
}
|
||||
|
||||
public fun JetQualifiedExpression.getReceiverExpression(): JetExpression {
|
||||
val left = PsiTreeUtil.findChildOfType(this, javaClass<JetExpression>())
|
||||
return left!!
|
||||
return getExpression(false) ?: throw AssertionError("No receiver found: ${JetPsiUtil.getElementTextWithContext(this)}")
|
||||
}
|
||||
|
||||
public fun JetQualifiedExpression.getSelectorExpression(): JetExpression? {
|
||||
var node: ASTNode? = getOperationTokenNode()
|
||||
while (node != null) {
|
||||
val psi = node!!.getPsi()
|
||||
if (psi is JetExpression) {
|
||||
return (psi as JetExpression)
|
||||
}
|
||||
node = node!!.getTreeNext()
|
||||
}
|
||||
return null
|
||||
return getExpression(true)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user