diff --git a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java index e7e5587a9e3..fbfd625e1c3 100644 --- a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java +++ b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java @@ -34,7 +34,7 @@ public class JetControlFlowProcessor { public void generateSubroutineControlFlow(@NotNull JetElement subroutineElement, @NotNull List body, boolean preferBlocks) { if (subroutineElement instanceof JetNamedDeclaration) { JetNamedDeclaration namedDeclaration = (JetNamedDeclaration) subroutineElement; - enterLabeledElement(namedDeclaration.getName(), namedDeclaration); + enterLabeledElement(JetPsiUtil.safeName(namedDeclaration.getName()), namedDeclaration); } boolean functionLiteral = subroutineElement instanceof JetFunctionLiteralExpression; builder.enterSubroutine(subroutineElement, functionLiteral); @@ -107,7 +107,10 @@ public class JetControlFlowProcessor { @Override public void visitParenthesizedExpression(JetParenthesizedExpression expression) { - value(expression.getExpression(), false); + JetExpression innerExpression = expression.getExpression(); + if (innerExpression != null) { + value(innerExpression, false); + } } @Override @@ -129,7 +132,9 @@ public class JetControlFlowProcessor { public void visitLabelQualifiedExpression(JetLabelQualifiedExpression expression) { String labelName = expression.getLabelName(); JetExpression labeledExpression = expression.getLabeledExpression(); - visitLabeledExpression(labelName, labeledExpression); + if (labelName != null && labeledExpression != null) { + visitLabeledExpression(labelName, labeledExpression); + } } private void visitLabeledExpression(@NotNull String labelName, @NotNull JetExpression labeledExpression) { @@ -143,23 +148,30 @@ public class JetControlFlowProcessor { @Override public void visitBinaryExpression(JetBinaryExpression expression) { IElementType operationType = expression.getOperationReference().getReferencedNameElementType(); + JetExpression right = expression.getRight(); if (operationType == JetTokens.ANDAND) { value(expression.getLeft(), false); Label resultLabel = builder.createUnboundLabel(); builder.jumpOnFalse(resultLabel); - value(expression.getRight(), false); + if (right != null) { + value(right, false); + } builder.bindLabel(resultLabel); } else if (operationType == JetTokens.OROR) { value(expression.getLeft(), false); Label resultLabel = builder.createUnboundLabel(); builder.jumpOnTrue(resultLabel); - value(expression.getRight(), false); + if (right != null) { + value(right, false); + } builder.bindLabel(resultLabel); } else { value(expression.getLeft(), false); - value(expression.getRight(), false); + if (right != null) { + value(right, false); + } builder.readNode(expression); } } @@ -168,7 +180,9 @@ public class JetControlFlowProcessor { public void visitUnaryExpression(JetUnaryExpression expression) { IElementType operationType = expression.getOperationSign().getReferencedNameElementType(); if (JetTokens.LABELS.contains(operationType)) { - visitLabeledExpression(expression.getOperationSign().getReferencedName().substring(1), expression.getBaseExpression()); + String referencedName = expression.getOperationSign().getReferencedName(); + referencedName = referencedName == null ? " " : referencedName; + visitLabeledExpression(referencedName.substring(1), expression.getBaseExpression()); } else { visitElement(expression); diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java b/idea/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java index c4c98193ea2..96d0e7425f0 100644 --- a/idea/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java +++ b/idea/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java @@ -15,4 +15,9 @@ public class JetPsiUtil { } return result; } + + @NotNull + public static String safeName(String name) { + return name == null ? "" : name; + } } diff --git a/idea/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java b/idea/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java index b3367150998..c7f75ef4bc7 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java @@ -30,7 +30,7 @@ public class ClassDescriptorResolver { ClassDescriptorImpl classDescriptor = new ClassDescriptorImpl( scope.getContainingDeclaration(), AttributeResolver.INSTANCE.resolveAttributes(classElement.getModifierList()), - safeName(classElement.getName())); + JetPsiUtil.safeName(classElement.getName())); trace.recordDeclarationResolution(classElement, classDescriptor); @@ -81,7 +81,7 @@ public class ClassDescriptorResolver { descriptor, AttributeResolver.INSTANCE.resolveAttributes(classElement.getModifierList()), !open, - safeName(classElement.getName()), + JetPsiUtil.safeName(classElement.getName()), typeParameters, supertypes); descriptor.setTypeConstructor( @@ -157,7 +157,7 @@ public class ClassDescriptorResolver { FunctionDescriptorImpl functionDescriptor = new FunctionDescriptorImpl( containingDescriptor, AttributeResolver.INSTANCE.resolveAttributes(function.getModifierList()), - safeName(function.getName()) + JetPsiUtil.safeName(function.getName()) ); WritableScope innerScope = semanticServices.createWritableScope(scope, functionDescriptor); innerScope.addLabeledDeclaration(functionDescriptor); @@ -216,7 +216,7 @@ public class ClassDescriptorResolver { functionDescriptor, i, AttributeResolver.INSTANCE.resolveAttributes(valueParameter.getModifierList()), - safeName(valueParameter.getName()), + JetPsiUtil.safeName(valueParameter.getName()), valueParameter.isMutable() ? type : null, type, valueParameter.getDefaultValue() != null, @@ -250,7 +250,7 @@ public class ClassDescriptorResolver { containingDescriptor, AttributeResolver.INSTANCE.resolveAttributes(typeParameter.getModifierList()), typeParameter.getVariance(), - safeName(typeParameter.getName()), + JetPsiUtil.safeName(typeParameter.getName()), Collections.singleton(bound), bound ); @@ -299,7 +299,7 @@ public class ClassDescriptorResolver { PropertyDescriptor propertyDescriptor = new PropertyDescriptorImpl( containingDeclaration, AttributeResolver.INSTANCE.resolveAttributes(parameter.getModifierList()), - safeName(parameter.getName()), + JetPsiUtil.safeName(parameter.getName()), parameter.isMutable() ? null : type, type); trace.recordDeclarationResolution(parameter, propertyDescriptor); @@ -327,7 +327,7 @@ public class ClassDescriptorResolver { PropertyDescriptorImpl propertyDescriptor = new PropertyDescriptorImpl( containingDeclaration, AttributeResolver.INSTANCE.resolveAttributes(property.getModifierList()), - safeName(property.getName()), + JetPsiUtil.safeName(property.getName()), property.isVar() ? type : null, type); trace.recordDeclarationResolution(property, propertyDescriptor); @@ -397,8 +397,4 @@ public class ClassDescriptorResolver { return propertyDescriptor; } - @NotNull - private static String safeName(String name) { - return name == null ? "" : name; - } }