Parser: Do not produce qualified expressions without receiver in package directives. Add assertion on JetQualifiedExpression

#KT-6907 Fixed
This commit is contained in:
Alexey Sedunov
2015-03-05 14:49:29 +03:00
parent cab301e8e2
commit 2684ce20d4
25 changed files with 235 additions and 25 deletions
@@ -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)
}
}