diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/PositioningStrategies.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/PositioningStrategies.java index c7f7dd2254e..8770d8a19bf 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/PositioningStrategies.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/PositioningStrategies.java @@ -105,10 +105,17 @@ public class PositioningStrategies { } }; - public static final PositioningStrategy NAMED_ELEMENT = new PositioningStrategy() { + public static final PositioningStrategy NAMED_ELEMENT = new DeclarationHeader() { + @Override + public boolean isValid(@NotNull PsiNameIdentifierOwner element) { + return (element.getNameIdentifier() != null || element instanceof JetObjectDeclaration) && super.isValid(element); + } + }; + + private static class DeclarationHeader extends PositioningStrategy { @NotNull @Override - public List mark(@NotNull PsiNameIdentifierOwner element) { + public List mark(@NotNull T element) { if (element instanceof JetNamedFunction) { JetNamedFunction function = (JetNamedFunction)element; PsiElement endOfSignatureElement; @@ -147,8 +154,21 @@ public class PositioningStrategies { return markRange(new TextRange( property.getTextRange().getStartOffset(), endOfSignatureElement.getTextRange().getEndOffset())); } + else if (element instanceof JetPropertyAccessor) { + JetPropertyAccessor accessor = (JetPropertyAccessor) element; + PsiElement endOfSignatureElement = accessor.getReturnTypeReference(); + if (endOfSignatureElement == null) { + ASTNode rpar = accessor.getRightParenthesis(); + endOfSignatureElement = rpar == null ? null : rpar.getPsi(); + } + if (endOfSignatureElement == null) { + endOfSignatureElement = accessor.getNamePlaceholder(); + } + return markRange(new TextRange( + accessor.getTextRange().getStartOffset(), endOfSignatureElement.getTextRange().getEndOffset())); + } else if (element instanceof JetClass) { - PsiElement nameAsDeclaration = element.getNameIdentifier(); + PsiElement nameAsDeclaration = ((JetClass) element).getNameIdentifier(); if (nameAsDeclaration == null) { return markElement(element); } @@ -160,16 +180,11 @@ public class PositioningStrategies { nameAsDeclaration.getTextRange().getStartOffset(), primaryConstructorParameterList.getTextRange().getEndOffset())); } else if (element instanceof JetObjectDeclaration) { - return NAME_IDENTIFIER.mark(element); + return NAME_IDENTIFIER.mark((JetObjectDeclaration) element); } return super.mark(element); } - - @Override - public boolean isValid(@NotNull PsiNameIdentifierOwner element) { - return (element.getNameIdentifier() != null || element instanceof JetObjectDeclaration) && super.isValid(element); - } - }; + } public static final PositioningStrategy DECLARATION = new PositioningStrategy() { @NotNull @@ -190,12 +205,12 @@ public class PositioningStrategies { } }; - public static final PositioningStrategy DECLARATION_OR_DEFAULT = new PositioningStrategy() { + public static final PositioningStrategy DECLARATION_OR_DEFAULT = new DeclarationHeader() { @NotNull @Override public List mark(@NotNull PsiElement element) { if (element instanceof JetDeclaration) { - return DECLARATION.mark((JetDeclaration) element); + return super.mark((JetDeclaration) element); } return DEFAULT.mark(element); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPropertyAccessor.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPropertyAccessor.java index f4060054992..8e07d7382f1 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPropertyAccessor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPropertyAccessor.java @@ -128,6 +128,11 @@ public class JetPropertyAccessor extends JetDeclarationStub