From fdac4c7ef4fd6977f082e92dc5da3523f26ed24f Mon Sep 17 00:00:00 2001 From: svtk Date: Tue, 27 Sep 2011 16:25:17 +0400 Subject: [PATCH] Diagnostic parameter types added; opportunity to import class of known type added --- .../resolve/java/JavaDescriptorResolver.java | 4 +- .../DiagnosticFactoryWithPsiElement1.java | 14 ++-- .../DiagnosticFactoryWithPsiElement2.java | 10 ++- .../DiagnosticFactoryWithPsiElement3.java | 14 ++-- .../lang/diagnostics/DiagnosticParameter.java | 7 ++ .../diagnostics/DiagnosticParameterImpl.java | 17 +++++ .../diagnostics/DiagnosticParameters.java | 14 ++++ .../DiagnosticWithAdditionalInfo.java | 26 ------- .../DiagnosticWithAdditionalInfoFactory1.java | 24 ------ .../diagnostics/DiagnosticWithParameters.java | 37 ++++++++++ .../DiagnosticWithParametersFactory.java | 27 +++++++ .../diagnostics/DiagnosticWithPsiElement.java | 2 + .../DiagnosticWithPsiElementImpl.java | 5 ++ .../jet/lang/diagnostics/Errors.java | 27 ++++--- .../diagnostics/RedeclarationDiagnostic.java | 5 ++ ...SimpleDiagnosticFactoryWithPsiElement.java | 8 +- .../jetbrains/jet/lang/psi/JetPsiFactory.java | 23 +++++- .../jet/lang/resolve/BodyResolver.java | 4 +- .../jetbrains/jet/plugin/JetPluginUtil.java | 73 +++++++++++++++++++ .../jet/plugin/annotations/JetPsiChecker.java | 6 +- .../plugin/quickfix/AddFunctionBodyFix.java | 9 +-- .../jet/plugin/quickfix/AddModifierFix.java | 8 +- .../quickfix/ChangeAccessorTypeFix.java | 18 +++-- .../quickfix/ChangeVariableMutabilityFix.java | 8 +- .../plugin/quickfix/ImportClassHelper.java | 57 +++++++++++++++ .../IntentionActionForPsiElement.java | 29 -------- .../plugin/quickfix/JetIntentionAction.java | 46 ++++++++++++ ...ry.java => JetIntentionActionFactory.java} | 4 +- .../jet/plugin/quickfix/ModifierFix.java | 2 +- .../jet/plugin/quickfix/QuickFixUtil.java | 22 ++---- .../jet/plugin/quickfix/QuickFixes.java | 23 +++--- .../quickfix/RemoveFunctionBodyFix.java | 9 +-- .../plugin/quickfix/RemoveModifierFix.java | 6 +- .../quickfix/RemovePartsFromPropertyFix.java | 35 ++++++--- .../quickfix/RemoveRedundantModifierFix.java | 19 ++--- .../RemoveRightPartOfBinaryExpressionFix.java | 14 ++-- ...ReplaceOperationInBinaryExpressionFix.java | 8 +- .../quickfix/ReplaceSafeCallToDotCall.java | 9 ++- .../JetDefaultModalityModifiersTest.java | 69 ++++++++---------- 39 files changed, 489 insertions(+), 253 deletions(-) create mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticParameter.java create mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticParameterImpl.java create mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticParameters.java delete mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithAdditionalInfo.java delete mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithAdditionalInfoFactory1.java create mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters.java create mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParametersFactory.java create mode 100644 idea/src/org/jetbrains/jet/plugin/JetPluginUtil.java create mode 100644 idea/src/org/jetbrains/jet/plugin/quickfix/ImportClassHelper.java delete mode 100644 idea/src/org/jetbrains/jet/plugin/quickfix/IntentionActionForPsiElement.java create mode 100644 idea/src/org/jetbrains/jet/plugin/quickfix/JetIntentionAction.java rename idea/src/org/jetbrains/jet/plugin/quickfix/{IntentionActionFactory.java => JetIntentionActionFactory.java} (53%) diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java index 2d4c8b30948..738ee857c9d 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java @@ -20,6 +20,8 @@ import java.util.*; * @author abreslav */ public class JavaDescriptorResolver { + + public static String JAVA_ROOT = ""; /*package*/ static final DeclarationDescriptor JAVA_METHOD_TYPE_PARAMETER_PARENT = new DeclarationDescriptorImpl(null, Collections.emptyList(), "") { @@ -263,7 +265,7 @@ public class JavaDescriptorResolver { JavaNamespaceDescriptor namespaceDescriptor = new JavaNamespaceDescriptor( resolveParentDescriptor(psiPackage), Collections.emptyList(), // TODO - name == null ? "" : name + name == null ? JAVA_ROOT : name ); namespaceDescriptor.setMemberScope(new JavaPackageScope(psiPackage.getQualifiedName(), namespaceDescriptor, semanticServices)); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactoryWithPsiElement1.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactoryWithPsiElement1.java index 4243d9ed02c..a0d3413d0ec 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactoryWithPsiElement1.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactoryWithPsiElement1.java @@ -27,22 +27,22 @@ public abstract class DiagnosticFactoryWithPsiElement1 } @NotNull - public Diagnostic on(@NotNull T element, @NotNull A argument) { + public DiagnosticWithPsiElement on(@NotNull T element, @NotNull A argument) { return on(element, element.getTextRange(), argument); } @NotNull - public Diagnostic on(@NotNull T element, @NotNull ASTNode node, @NotNull A argument) { - return on(element, node.getTextRange(), argument); + public DiagnosticWithPsiElement on(@NotNull T elementToBlame, @NotNull ASTNode nodeToMark, @NotNull A argument) { + return on(elementToBlame, nodeToMark.getTextRange(), argument); } @NotNull - public Diagnostic on(@NotNull T element, @NotNull PsiElement psiElement, @NotNull A argument) { - return on(element, psiElement.getTextRange(), argument); + public DiagnosticWithPsiElement on(@NotNull T elementToBlame, @NotNull PsiElement elementToMark, @NotNull A argument) { + return on(elementToBlame, elementToMark.getTextRange(), argument); } @NotNull - protected Diagnostic on(@NotNull T element, @NotNull TextRange textRange, @NotNull A argument) { - return new DiagnosticWithPsiElementImpl(this, severity, makeMessage(argument), element, textRange); + protected DiagnosticWithPsiElement on(@NotNull T elementToBlame, @NotNull TextRange textRangeToMark, @NotNull A argument) { + return new DiagnosticWithPsiElementImpl(this, severity, makeMessage(argument), elementToBlame, textRangeToMark); } } \ No newline at end of file diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactoryWithPsiElement2.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactoryWithPsiElement2.java index 3453f4c0be0..ce1a0bb29c2 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactoryWithPsiElement2.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactoryWithPsiElement2.java @@ -31,12 +31,16 @@ public abstract class DiagnosticFactoryWithPsiElement2 on(@NotNull T element, @NotNull A a, @NotNull B b) { return on(element, element.getNode(), a, b); } @NotNull - public Diagnostic on(@NotNull T element, @NotNull ASTNode node, @NotNull A a, @NotNull B b) { - return new DiagnosticWithPsiElementImpl(this, severity, makeMessage(a, b), element, node.getTextRange()); + public DiagnosticWithPsiElement on(@NotNull T elementToBlame, @NotNull ASTNode nodeToMark, @NotNull A a, @NotNull B b) { + return makeDiagnostic(new DiagnosticWithPsiElementImpl(this, severity, makeMessage(a, b), elementToBlame, nodeToMark.getTextRange())); + } + + public DiagnosticWithPsiElement makeDiagnostic(DiagnosticWithPsiElement diagnostic) { + return diagnostic; } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactoryWithPsiElement3.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactoryWithPsiElement3.java index ffd61d4dfe2..7f5499d2a00 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactoryWithPsiElement3.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactoryWithPsiElement3.java @@ -34,23 +34,23 @@ public abstract class DiagnosticFactoryWithPsiElement3 on(@NotNull T element, @NotNull A a, @NotNull B b, @NotNull C c) { return on(element, element, a, b, c); } @NotNull - public Diagnostic on(@NotNull T element, @NotNull PsiElement psiElement, @NotNull A a, @NotNull B b, @NotNull C c) { - return on(element, psiElement.getTextRange(), a, b, c); + public DiagnosticWithPsiElement on(@NotNull T elementToBlame, @NotNull PsiElement elementToMark, @NotNull A a, @NotNull B b, @NotNull C c) { + return on(elementToBlame, elementToMark.getTextRange(), a, b, c); } @NotNull - public Diagnostic on(@NotNull T element, @NotNull ASTNode node, @NotNull A a, @NotNull B b, @NotNull C c) { - return on(element, node.getTextRange(), a, b, c); + public DiagnosticWithPsiElement on(@NotNull T elementToBlame, @NotNull ASTNode nodeToMark, @NotNull A a, @NotNull B b, @NotNull C c) { + return on(elementToBlame, nodeToMark.getTextRange(), a, b, c); } @NotNull - protected Diagnostic on(@NotNull T element, @NotNull TextRange textRange, @NotNull A a, @NotNull B b, @NotNull C c) { - return new DiagnosticWithPsiElementImpl(this, severity, makeMessage(a, b, c), element, textRange); + protected DiagnosticWithPsiElement on(@NotNull T elementToBlame, @NotNull TextRange textRangeToMark, @NotNull A a, @NotNull B b, @NotNull C c) { + return new DiagnosticWithPsiElementImpl(this, severity, makeMessage(a, b, c), elementToBlame, textRangeToMark); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticParameter.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticParameter.java new file mode 100644 index 00000000000..869b6e929a9 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticParameter.java @@ -0,0 +1,7 @@ +package org.jetbrains.jet.lang.diagnostics; + +/** + * @author svtk + */ +public interface DiagnosticParameter

{ +} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticParameterImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticParameterImpl.java new file mode 100644 index 00000000000..d3cf7cf003e --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticParameterImpl.java @@ -0,0 +1,17 @@ +package org.jetbrains.jet.lang.diagnostics; + +/** + * @author svtk + */ +public class DiagnosticParameterImpl

implements DiagnosticParameter

{ + private final String value; + + public DiagnosticParameterImpl(String value) { + this.value = value; + } + + @Override + public String toString() { + return this.value; + } +} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticParameters.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticParameters.java new file mode 100644 index 00000000000..b0bd0d82fa7 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticParameters.java @@ -0,0 +1,14 @@ +package org.jetbrains.jet.lang.diagnostics; + +import org.jetbrains.jet.lang.psi.JetModifierListOwner; +import org.jetbrains.jet.lang.types.JetType; +import org.jetbrains.jet.lexer.JetKeywordToken; + +/** + * @author svtk + */ +public interface DiagnosticParameters { + DiagnosticParameter MODIFIER = new DiagnosticParameterImpl("MODIFIER"); + DiagnosticParameter CLASS = new DiagnosticParameterImpl("CLASS"); + DiagnosticParameter TYPE = new DiagnosticParameterImpl("TYPE"); +} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithAdditionalInfo.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithAdditionalInfo.java deleted file mode 100644 index a1374e5bb6a..00000000000 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithAdditionalInfo.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.jetbrains.jet.lang.diagnostics; - -import com.intellij.openapi.util.TextRange; -import com.intellij.psi.PsiElement; -import org.jetbrains.annotations.NotNull; - -/** - * @author svtk - */ -public class DiagnosticWithAdditionalInfo extends DiagnosticWithPsiElementImpl { - private final I info; - - public DiagnosticWithAdditionalInfo(DiagnosticFactory factory, Severity severity, String message, T psiElement, I info) { - super(factory, severity, message, psiElement); - this.info = info; - } - - public DiagnosticWithAdditionalInfo(DiagnosticFactory factory, Severity severity, String message, T psiElement, @NotNull TextRange textRange, I info) { - super(factory, severity, message, psiElement, textRange); - this.info = info; - } - - public I getInfo() { - return info; - } -} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithAdditionalInfoFactory1.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithAdditionalInfoFactory1.java deleted file mode 100644 index fa9200d63a8..00000000000 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithAdditionalInfoFactory1.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.jetbrains.jet.lang.diagnostics; - -import com.intellij.openapi.util.TextRange; -import com.intellij.psi.PsiElement; -import org.jetbrains.annotations.NotNull; - -/** - * @author svtk - */ -public class DiagnosticWithAdditionalInfoFactory1 extends PsiElementOnlyDiagnosticFactory1 { - public static DiagnosticWithAdditionalInfoFactory1 create(Severity severity, String messageStub) { - return new DiagnosticWithAdditionalInfoFactory1(severity, messageStub); - } - - protected DiagnosticWithAdditionalInfoFactory1(Severity severity, String message) { - super(severity, message); - } - - @NotNull - @Override - protected Diagnostic on(@NotNull T element, @NotNull TextRange textRange, @NotNull A argument) { - return new DiagnosticWithAdditionalInfo(this, severity, makeMessage(argument), element, textRange, argument); - } -} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters.java new file mode 100644 index 00000000000..d6b29d8c3be --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters.java @@ -0,0 +1,37 @@ +package org.jetbrains.jet.lang.diagnostics; + +import com.google.common.collect.Maps; +import com.intellij.psi.PsiElement; +import org.jetbrains.jet.lexer.JetKeywordToken; +import org.jetbrains.jet.util.slicedmap.MutableSlicedMap; +import org.jetbrains.jet.util.slicedmap.ReadOnlySlice; +import org.jetbrains.jet.util.slicedmap.SlicedMapImpl; +import org.jetbrains.jet.util.slicedmap.WritableSlice; + +import java.util.Map; + +/** + * @author svtk + */ +public class DiagnosticWithParameters extends DiagnosticWithPsiElementImpl { + + private final Map map = Maps.newHashMap(); + + public DiagnosticWithParameters(DiagnosticWithPsiElement diagnostic) { + super(diagnostic.getFactory(), diagnostic.getSeverity(), diagnostic.getMessage(), diagnostic.getPsiElement(), diagnostic.getTextRange()); + } + + @Override + public

DiagnosticWithPsiElement add(DiagnosticParameter

parameterType, P parameter) { + map.put(parameterType, parameter); + return this; + } + + public

P getParameter(DiagnosticParameter

parameterType) { + return (P) map.get(parameterType); + } + + public

boolean hasParameter(DiagnosticParameter

parameterType) { + return getParameter(parameterType) != null; + } +} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParametersFactory.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParametersFactory.java new file mode 100644 index 00000000000..e51f936cb73 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParametersFactory.java @@ -0,0 +1,27 @@ +package org.jetbrains.jet.lang.diagnostics; + +import com.intellij.openapi.util.TextRange; +import com.intellij.psi.PsiElement; +import org.jetbrains.annotations.NotNull; + +/** + * @author svtk + */ +public class DiagnosticWithParametersFactory extends PsiElementOnlyDiagnosticFactory1 { + public static DiagnosticWithParametersFactory create(Severity severity, String messageStub, DiagnosticParameter diagnosticParameter) { + return new DiagnosticWithParametersFactory(severity, messageStub, diagnosticParameter); + } + + private final DiagnosticParameter diagnosticParameter; + + protected DiagnosticWithParametersFactory(Severity severity, String message, DiagnosticParameter diagnosticParameter) { + super(severity, message); + this.diagnosticParameter = diagnosticParameter; + } + + @NotNull + @Override + protected DiagnosticWithPsiElement on(@NotNull T elementToBlame, @NotNull TextRange textRangeToMark, @NotNull A argument) { + return super.on(elementToBlame, textRangeToMark, argument).add(diagnosticParameter, argument); + } +} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithPsiElement.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithPsiElement.java index 30b4aac5aff..c3b8b5b9f8c 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithPsiElement.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithPsiElement.java @@ -9,4 +9,6 @@ import org.jetbrains.annotations.NotNull; public interface DiagnosticWithPsiElement extends DiagnosticWithTextRange { @NotNull T getPsiElement(); + +

DiagnosticWithPsiElement add(DiagnosticParameter

parameterType, P parameter); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithPsiElementImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithPsiElementImpl.java index 4c9914d4967..55371d51e1d 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithPsiElementImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithPsiElementImpl.java @@ -24,4 +24,9 @@ public class DiagnosticWithPsiElementImpl extends GenericD public T getPsiElement() { return psiElement; } + + @Override + public

DiagnosticWithPsiElement add(DiagnosticParameter

parameterType, P parameter) { + return (new DiagnosticWithParameters(this)).add(parameterType, parameter); + } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java index af17069d46f..3848a5d6d90 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -63,8 +63,8 @@ public interface Errors { PsiElementOnlyDiagnosticFactory2 REDUNDANT_MODIFIER = new PsiElementOnlyDiagnosticFactory2(Severity.WARNING, "Modifier {0} is redundant because {1} is present") { @NotNull @Override - public Diagnostic on(@NotNull JetModifierList element, @NotNull ASTNode node, @NotNull JetKeywordToken redundantModifier, @NotNull JetKeywordToken presentModifier) { - return new DiagnosticWithAdditionalInfo(this, severity, makeMessage(redundantModifier, presentModifier), element, node.getTextRange(), redundantModifier); + public DiagnosticWithPsiElement on(@NotNull JetModifierList elementToBlame, @NotNull ASTNode nodeToMark, @NotNull JetKeywordToken redundantModifier, @NotNull JetKeywordToken presentModifier) { + return super.on(elementToBlame, nodeToMark, redundantModifier, presentModifier).add(DiagnosticParameters.MODIFIER, redundantModifier); } }; SimpleDiagnosticFactory SAFE_CALLS_ARE_NOT_ALLOWED_ON_NAMESPACES = SimpleDiagnosticFactory.create(ERROR, "Safe calls are not allowed on namespaces"); @@ -88,27 +88,26 @@ public interface Errors { SimpleDiagnosticFactory FUNCTION_WITH_NO_TYPE_NO_BODY = SimpleDiagnosticFactory.create(ERROR, "This function must either declare a return type or have a body element"); SimplePsiElementOnlyDiagnosticFactory ABSTRACT_PROPERTY_IN_PRIMARY_CONSTRUCTOR_PARAMETERS = SimplePsiElementOnlyDiagnosticFactory.create(ERROR, "This property cannot be declared abstract"); SimplePsiElementOnlyDiagnosticFactory ABSTRACT_PROPERTY_NOT_IN_CLASS = SimplePsiElementOnlyDiagnosticFactory.create(ERROR, "A property may be abstract only when defined in a class or trait"); - //TODO pass String instead of JetType or ensure JetType's value is computed - DiagnosticWithAdditionalInfoFactory1 ABSTRACT_PROPERTY_WITH_INITIALIZER = DiagnosticWithAdditionalInfoFactory1.create(ERROR, "Property with initializer cannot be abstract"); - DiagnosticWithAdditionalInfoFactory1 ABSTRACT_PROPERTY_WITH_GETTER = DiagnosticWithAdditionalInfoFactory1.create(ERROR, "Property with getter implementation cannot be abstract"); - DiagnosticWithAdditionalInfoFactory1 ABSTRACT_PROPERTY_WITH_SETTER = DiagnosticWithAdditionalInfoFactory1.create(ERROR, "Property with setter implementation cannot be abstract"); + DiagnosticWithParametersFactory ABSTRACT_PROPERTY_WITH_INITIALIZER = DiagnosticWithParametersFactory.create(ERROR, "Property with initializer cannot be abstract", DiagnosticParameters.TYPE); + DiagnosticWithParametersFactory ABSTRACT_PROPERTY_WITH_GETTER = DiagnosticWithParametersFactory.create(ERROR, "Property with getter implementation cannot be abstract", DiagnosticParameters.TYPE); + DiagnosticWithParametersFactory ABSTRACT_PROPERTY_WITH_SETTER = DiagnosticWithParametersFactory.create(ERROR, "Property with setter implementation cannot be abstract", DiagnosticParameters.TYPE); SimpleDiagnosticFactory BACKING_FIELD_IN_TRAIT = SimpleDiagnosticFactory.create(ERROR, "Property in a trait cannot have a backing field"); SimpleDiagnosticFactory MUST_BE_INITIALIZED = SimpleDiagnosticFactory.create(ERROR, "Property must be initialized"); SimplePsiElementOnlyDiagnosticFactory MUST_BE_INITIALIZED_OR_BE_ABSTRACT = SimplePsiElementOnlyDiagnosticFactory.create(ERROR, "Property must be initialized or be abstract"); - SimpleDiagnosticFactory PROPERTY_INITIALIZER_IN_TRAIT = SimpleDiagnosticFactory.create(ERROR, "Property initializers are not allowed in traits"); + DiagnosticWithParametersFactory PROPERTY_INITIALIZER_IN_TRAIT = DiagnosticWithParametersFactory.create(ERROR, "Property initializers are not allowed in traits", DiagnosticParameters.TYPE); SimpleDiagnosticFactory PROPERTY_INITIALIZER_NO_BACKING_FIELD = SimpleDiagnosticFactory.create(ERROR, "Initializer is not allowed here because this property has no backing field"); SimpleDiagnosticFactory PROPERTY_INITIALIZER_NO_PRIMARY_CONSTRUCTOR = SimpleDiagnosticFactory.create(ERROR, "Property initializers are not allowed when no primary constructor is present"); SimplePsiElementOnlyDiagnosticFactory REDUNDANT_ABSTRACT = SimplePsiElementOnlyDiagnosticFactory.create(WARNING, "Abstract modifier is redundant in traits"); - PsiElementOnlyDiagnosticFactory3 ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS = new PsiElementOnlyDiagnosticFactory3(ERROR, "Abstract property {0} in non-abstract class {1}") { + PsiElementOnlyDiagnosticFactory3 ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS = new PsiElementOnlyDiagnosticFactory3(ERROR, "Abstract property {0} in non-abstract class {1}") { @NotNull - protected Diagnostic on(@NotNull JetModifierListOwner element, @NotNull TextRange textRange, @NotNull String s, @NotNull ClassDescriptor classDescriptor, @NotNull JetClass jetClass) { - return new DiagnosticWithAdditionalInfo(this, severity, makeMessage(s, classDescriptor, jetClass), element, textRange, jetClass); + protected DiagnosticWithPsiElement on(@NotNull JetModifierListOwner elementToBlame, @NotNull TextRange textRangeToMark, @NotNull String s, @NotNull ClassDescriptor classDescriptor, @NotNull JetModifierListOwner aClass) { + return super.on(elementToBlame, textRangeToMark, s, classDescriptor, aClass).add(DiagnosticParameters.CLASS, aClass); } }; PsiElementOnlyDiagnosticFactory3 ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS = new PsiElementOnlyDiagnosticFactory3(ERROR, "Abstract function {0} in non-abstract class {1}") { @NotNull - public Diagnostic on(@NotNull JetFunctionOrPropertyAccessor element, @NotNull ASTNode node, @NotNull String s, @NotNull ClassDescriptor classDescriptor, @NotNull JetModifierListOwner jetClass) { - return new DiagnosticWithAdditionalInfo(this, severity, makeMessage(s, classDescriptor, jetClass), element, node.getTextRange(), jetClass); + public DiagnosticWithPsiElement on(@NotNull JetFunctionOrPropertyAccessor elementToBlame, @NotNull ASTNode nodeToMark, @NotNull String s, @NotNull ClassDescriptor classDescriptor, @NotNull JetModifierListOwner modifierListOwner) { + return super.on(elementToBlame, nodeToMark, s, classDescriptor, modifierListOwner).add(DiagnosticParameters.CLASS, modifierListOwner); } }; PsiElementOnlyDiagnosticFactory1 ABSTRACT_FUNCTION_WITH_BODY = PsiElementOnlyDiagnosticFactory1.create(ERROR, "A function {0} with body cannot be abstract"); @@ -162,8 +161,8 @@ public interface Errors { SimplePsiElementOnlyDiagnosticFactory USELESS_CAST_STATIC_ASSERT_IS_FINE = SimplePsiElementOnlyDiagnosticFactory.create(WARNING, "No cast needed, use ':' instead"); SimplePsiElementOnlyDiagnosticFactory USELESS_CAST = SimplePsiElementOnlyDiagnosticFactory.create(WARNING, "No cast needed"); SimpleDiagnosticFactory CAST_NEVER_SUCCEEDS = SimpleDiagnosticFactory.create(WARNING, "This cast can never succeed"); - DiagnosticWithAdditionalInfoFactory1 WRONG_SETTER_PARAMETER_TYPE = DiagnosticWithAdditionalInfoFactory1.create(ERROR, "Setter parameter type must be equal to the type of the property, i.e. {0}"); - DiagnosticWithAdditionalInfoFactory1 WRONG_GETTER_RETURN_TYPE = DiagnosticWithAdditionalInfoFactory1.create(ERROR, "Getter return type must be equal to the type of the property, i.e. {0}"); + DiagnosticWithParametersFactory WRONG_SETTER_PARAMETER_TYPE = DiagnosticWithParametersFactory.create(ERROR, "Setter parameter type must be equal to the type of the property, i.e. {0}", DiagnosticParameters.TYPE); + DiagnosticWithParametersFactory WRONG_GETTER_RETURN_TYPE = DiagnosticWithParametersFactory.create(ERROR, "Getter return type must be equal to the type of the property, i.e. {0}", DiagnosticParameters.TYPE); ParameterizedDiagnosticFactory1 NO_CLASS_OBJECT = ParameterizedDiagnosticFactory1.create(ERROR, "Classifier {0} does not have a class object", NAME); SimpleDiagnosticFactory NO_GENERICS_IN_SUPERTYPE_SPECIFIER = SimpleDiagnosticFactory.create(ERROR, "Generic arguments of the base type must be specified"); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnostic.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnostic.java index eafe8595cab..9092b9edf19 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnostic.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnostic.java @@ -74,6 +74,11 @@ public interface RedeclarationDiagnostic extends DiagnosticWithPsiElement DiagnosticWithPsiElement add(DiagnosticParameter

parameterType, P parameter) { + throw new UnsupportedOperationException(); + } } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/SimpleDiagnosticFactoryWithPsiElement.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/SimpleDiagnosticFactoryWithPsiElement.java index f11e699ea5a..a0da054399a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/SimpleDiagnosticFactoryWithPsiElement.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/SimpleDiagnosticFactoryWithPsiElement.java @@ -17,13 +17,13 @@ public abstract class SimpleDiagnosticFactoryWithPsiElement(this, severity, message, element, node.getTextRange()); + public Diagnostic on(@NotNull T elementToBlame, @NotNull ASTNode nodeToMark) { + return new DiagnosticWithPsiElementImpl(this, severity, message, elementToBlame, nodeToMark.getTextRange()); } @NotNull - public Diagnostic on(@NotNull T element, @NotNull PsiElement psiElement) { - return new DiagnosticWithPsiElementImpl(this, severity, message, element, psiElement.getTextRange()); + public Diagnostic on(@NotNull T elementToBlame, @NotNull PsiElement elementToMark) { + return new DiagnosticWithPsiElementImpl(this, severity, message, elementToBlame, elementToMark.getTextRange()); } @NotNull diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiFactory.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiFactory.java index 75f9a9a76d5..c1081a1bcf5 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiFactory.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiFactory.java @@ -28,12 +28,21 @@ public class JetPsiFactory { JetProperty property = createProperty(project, "val x : Int"); return new PsiElement[] { property.findElementAt(5), property.findElementAt(6), property.findElementAt(7) }; } - + public static PsiElement createWhiteSpace(Project project) { - JetProperty property = createProperty(project, "val x"); + return createWhiteSpace(project, " "); + } + + public static PsiElement createWhiteSpace(Project project, String text) { + JetProperty property = createProperty(project, "val" + text + "x"); return property.findElementAt(3); } +// public static PsiElement createEndOfLine(Project project) { +// JetNamedFunction function = createFunction(project, "fun f { \n }"); +// return function.findElementAt(8); +// } + public static JetClass createClass(Project project, String text) { return createDeclaration(project, text, JetClass.class); } @@ -80,4 +89,14 @@ public class JetPsiFactory { JetNamedFunction function = createFunction(project, "fun foo() {}"); return function.getBodyExpression(); } + + public static JetNamespace createNamespace(Project project, String text) { + JetFile file = createFile(project, text); + return file.getRootNamespace(); + } + + public static JetImportDirective createImportDirective(Project project, String classPath) { + JetNamespace namespace = createNamespace(project, "import " + classPath); + return namespace.getImportDirectives().iterator().next(); + } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java index 2beff92cbe7..49f3ab85867 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java @@ -517,8 +517,6 @@ public class BodyResolver { if (propertyDescriptor.getModality() == Modality.ABSTRACT) { JetType returnType = propertyDescriptor.getReturnType(); - //TODO We need ensure here that jet type is computed or pass it's computed name to quick fix instead - returnType.equals(new Object()); JetExpression initializer = property.getInitializer(); if (initializer != null) { @@ -568,7 +566,7 @@ public class BodyResolver { } if (inTrait) { // context.getTrace().getErrorHandler().genericError(initializer.getNode(), "Property initializers are not allowed in traits"); - context.getTrace().report(PROPERTY_INITIALIZER_IN_TRAIT.on(initializer)); + context.getTrace().report(PROPERTY_INITIALIZER_IN_TRAIT.on(property, initializer, propertyDescriptor.getReturnType())); } else if (!backingFieldRequired) { // context.getTrace().getErrorHandler().genericError(initializer.getNode(), "Initializer is not allowed here because this property has no backing field"); diff --git a/idea/src/org/jetbrains/jet/plugin/JetPluginUtil.java b/idea/src/org/jetbrains/jet/plugin/JetPluginUtil.java new file mode 100644 index 00000000000..2bbac86b500 --- /dev/null +++ b/idea/src/org/jetbrains/jet/plugin/JetPluginUtil.java @@ -0,0 +1,73 @@ +package org.jetbrains.jet.plugin; + +import com.google.common.collect.Lists; +import com.intellij.openapi.project.Project; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; +import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; +import org.jetbrains.jet.lang.resolve.java.JavaClassDescriptor; +import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; +import org.jetbrains.jet.lang.types.DeferredType; +import org.jetbrains.jet.lang.types.JetStandardLibrary; +import org.jetbrains.jet.lang.types.JetType; + +import java.util.LinkedList; + +/** + * @author svtk + */ +public class JetPluginUtil { + @NotNull + public static String computeTypeFullName(JetType type) { + LinkedList fullName = computeTypeFullNameList(type); + String last = fullName.getLast(); + StringBuilder sb = new StringBuilder(); + for (String s : fullName) { + sb.append(s); + if (s != last) { + sb.append('.'); + } + } + return sb.toString(); + } + + @NotNull + private static LinkedList computeTypeFullNameList(JetType type) { + if (type instanceof DeferredType) { + type = ((DeferredType)type).getActualType(); + } + DeclarationDescriptor declarationDescriptor = type.getConstructor().getDeclarationDescriptor(); + + LinkedList fullName = Lists.newLinkedList(); + while (declarationDescriptor != null) { + fullName.addFirst(declarationDescriptor.getName()); + declarationDescriptor = declarationDescriptor.getContainingDeclaration(); + } + assert fullName.size() > 0; + if (JavaDescriptorResolver.JAVA_ROOT.equals(fullName.getFirst())) { + fullName.removeFirst(); + } + return fullName; + } + + public static boolean checkTypeIsStandard(JetType type, Project project) { + LinkedList fullName = computeTypeFullNameList(type); + if (fullName.size() == 3 && fullName.getFirst().equals("java") && fullName.get(1).equals("lang")) { + return true; + } + + JetStandardLibrary standardLibrary = JetStandardLibrary.getJetStandardLibrary(project); + JetScope libraryScope = standardLibrary.getLibraryScope(); + + DeclarationDescriptor declaration = type.getMemberScope().getContainingDeclaration(); + if (declaration instanceof JavaClassDescriptor) { + return false; + } + while (!(declaration instanceof NamespaceDescriptor)) { + declaration = declaration.getContainingDeclaration(); + assert declaration != null; + } + return libraryScope == ((NamespaceDescriptor) declaration).getMemberScope(); + } +} diff --git a/idea/src/org/jetbrains/jet/plugin/annotations/JetPsiChecker.java b/idea/src/org/jetbrains/jet/plugin/annotations/JetPsiChecker.java index 54e7aceec3e..f3f1293b5c5 100644 --- a/idea/src/org/jetbrains/jet/plugin/annotations/JetPsiChecker.java +++ b/idea/src/org/jetbrains/jet/plugin/annotations/JetPsiChecker.java @@ -23,7 +23,7 @@ import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.plugin.AnalyzerFacade; import org.jetbrains.jet.plugin.JetHighlighter; -import org.jetbrains.jet.plugin.quickfix.IntentionActionFactory; +import org.jetbrains.jet.plugin.quickfix.JetIntentionActionFactory; import org.jetbrains.jet.plugin.quickfix.QuickFixes; import java.util.Collection; @@ -90,8 +90,8 @@ public class JetPsiChecker implements Annotator { DiagnosticWithPsiElement diagnosticWithPsiElement = (DiagnosticWithPsiElement) diagnostic; if (diagnostic.getFactory() instanceof PsiElementOnlyDiagnosticFactory) { PsiElementOnlyDiagnosticFactory factory = (PsiElementOnlyDiagnosticFactory) diagnostic.getFactory(); - Collection intentionActionFactories = QuickFixes.get(factory); - for (IntentionActionFactory intentionActionFactory : intentionActionFactories) { + Collection intentionActionFactories = QuickFixes.get(factory); + for (JetIntentionActionFactory intentionActionFactory : intentionActionFactories) { IntentionAction action = null; if (intentionActionFactory != null) { action = intentionActionFactory.createAction(diagnosticWithPsiElement); diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/AddFunctionBodyFix.java b/idea/src/org/jetbrains/jet/plugin/quickfix/AddFunctionBodyFix.java index f788b7b7698..7131d3b0e02 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/AddFunctionBodyFix.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/AddFunctionBodyFix.java @@ -8,12 +8,11 @@ import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.diagnostics.DiagnosticWithPsiElement; import org.jetbrains.jet.lang.psi.*; -import org.jetbrains.jet.lexer.JetTokens; /** * @author svtk */ -public class AddFunctionBodyFix extends IntentionActionForPsiElement { +public class AddFunctionBodyFix extends JetIntentionAction { public AddFunctionBodyFix(@NotNull JetFunctionOrPropertyAccessor element) { super(element); } @@ -49,10 +48,10 @@ public class AddFunctionBodyFix extends IntentionActionForPsiElement createFactory() { - return new IntentionActionFactory() { + public static JetIntentionActionFactory createFactory() { + return new JetIntentionActionFactory() { @Override - public IntentionActionForPsiElement createAction(DiagnosticWithPsiElement diagnostic) { + public JetIntentionAction createAction(DiagnosticWithPsiElement diagnostic) { assert diagnostic.getPsiElement() instanceof JetFunctionOrPropertyAccessor; return new AddFunctionBodyFix((JetFunctionOrPropertyAccessor) diagnostic.getPsiElement()); } diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/AddModifierFix.java b/idea/src/org/jetbrains/jet/plugin/quickfix/AddModifierFix.java index 44ae3e5cae0..c22862070c7 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/AddModifierFix.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/AddModifierFix.java @@ -97,17 +97,17 @@ public class AddModifierFix extends ModifierFix { return true; } - public static IntentionActionFactory createFactory(final JetKeywordToken modifier, final JetToken[] modifiersThatCanBeReplaced, final JetToken[] conflictedModifiers) { - return new IntentionActionFactory() { + public static JetIntentionActionFactory createFactory(final JetKeywordToken modifier, final JetToken[] modifiersThatCanBeReplaced, final JetToken[] conflictedModifiers) { + return new JetIntentionActionFactory() { @Override - public IntentionActionForPsiElement createAction(DiagnosticWithPsiElement diagnostic) { + public JetIntentionAction createAction(DiagnosticWithPsiElement diagnostic) { assert diagnostic.getPsiElement() instanceof JetModifierListOwner; return new AddModifierFix((JetModifierListOwner) diagnostic.getPsiElement(), modifier, modifiersThatCanBeReplaced, conflictedModifiers); } }; } - public static IntentionActionFactory createFactory(final JetKeywordToken modifier) { + public static JetIntentionActionFactory createFactory(final JetKeywordToken modifier) { return createFactory(modifier, new JetToken[0], new JetToken[0]); } } diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeAccessorTypeFix.java b/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeAccessorTypeFix.java index 20a89e360ac..dfab9fc0a0e 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeAccessorTypeFix.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeAccessorTypeFix.java @@ -2,11 +2,13 @@ package org.jetbrains.jet.plugin.quickfix; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.impl.source.codeStyle.CodeEditUtil; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.diagnostics.DiagnosticWithAdditionalInfo; +import org.jetbrains.jet.lang.diagnostics.DiagnosticParameters; +import org.jetbrains.jet.lang.diagnostics.DiagnosticWithParameters; import org.jetbrains.jet.lang.diagnostics.DiagnosticWithPsiElement; import org.jetbrains.jet.lang.psi.JetParameter; import org.jetbrains.jet.lang.psi.JetPropertyAccessor; @@ -17,7 +19,7 @@ import org.jetbrains.jet.lang.types.JetType; /** * @author svtk */ -public class ChangeAccessorTypeFix extends IntentionActionForPsiElement { +public class ChangeAccessorTypeFix extends JetIntentionAction { private final JetType type; public ChangeAccessorTypeFix(@NotNull JetPropertyAccessor element, JetType type) { @@ -58,14 +60,14 @@ public class ChangeAccessorTypeFix extends IntentionActionForPsiElement createFactory() { - return new IntentionActionFactory() { + public static JetIntentionActionFactory createFactory() { + return new JetIntentionActionFactory() { @Override - public IntentionActionForPsiElement createAction(DiagnosticWithPsiElement diagnostic) { - assert diagnostic instanceof DiagnosticWithAdditionalInfo; + public JetIntentionAction createAction(DiagnosticWithPsiElement diagnostic) { assert diagnostic.getPsiElement() instanceof JetPropertyAccessor; - assert ((DiagnosticWithAdditionalInfo) diagnostic).getInfo() instanceof JetType; - return new ChangeAccessorTypeFix((JetPropertyAccessor) diagnostic.getPsiElement(), (JetType) ((DiagnosticWithAdditionalInfo) diagnostic).getInfo()); + DiagnosticWithParameters diagnosticWithParameters = assertAndCastToDiagnosticWithParameters(diagnostic, DiagnosticParameters.TYPE); + JetType type = diagnosticWithParameters.getParameter(DiagnosticParameters.TYPE); + return new ChangeAccessorTypeFix((JetPropertyAccessor) diagnostic.getPsiElement(), type); } }; } diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeVariableMutabilityFix.java b/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeVariableMutabilityFix.java index cd3deb20e2a..a55b23da7c8 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeVariableMutabilityFix.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeVariableMutabilityFix.java @@ -15,7 +15,7 @@ import org.jetbrains.jet.lexer.JetTokens; /** * @author svtk */ -public class ChangeVariableMutabilityFix extends IntentionActionForPsiElement { +public class ChangeVariableMutabilityFix extends JetIntentionAction { public ChangeVariableMutabilityFix(@NotNull JetProperty element) { super(element); } @@ -52,10 +52,10 @@ public class ChangeVariableMutabilityFix extends IntentionActionForPsiElement createFactory() { - return new IntentionActionFactory() { + public static JetIntentionActionFactory createFactory() { + return new JetIntentionActionFactory() { @Override - public IntentionActionForPsiElement createAction(DiagnosticWithPsiElement diagnostic) { + public JetIntentionAction createAction(DiagnosticWithPsiElement diagnostic) { assert diagnostic.getPsiElement() instanceof JetProperty; return new ChangeVariableMutabilityFix((JetProperty) diagnostic.getPsiElement()); } diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/ImportClassHelper.java b/idea/src/org/jetbrains/jet/plugin/quickfix/ImportClassHelper.java new file mode 100644 index 00000000000..09c5891de8f --- /dev/null +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/ImportClassHelper.java @@ -0,0 +1,57 @@ +package org.jetbrains.jet.plugin.quickfix; + +import com.intellij.psi.PsiElement; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.psi.*; +import org.jetbrains.jet.lang.types.JetType; +import org.jetbrains.jet.plugin.JetPluginUtil; + +import java.util.List; + +/** + * @author svtk + */ +public class ImportClassHelper { + public static void perform(@NotNull JetType type, @NotNull PsiElement element, @NotNull PsiElement newElement) { + PsiElement parent = element; + while (!(parent instanceof JetNamespace)) { + parent = parent.getParent(); + assert parent != null; + } + JetNamespace namespace = (JetNamespace) parent; + List importDirectives = namespace.getImportDirectives(); + + if (JetPluginUtil.checkTypeIsStandard(type, element.getProject())) { + element.replace(newElement); + return; + } + + String typeFullName = JetPluginUtil.computeTypeFullName(type); + + JetImportDirective newDirective = JetPsiFactory.createImportDirective(element.getProject(), typeFullName); + + if (!importDirectives.isEmpty()) { + boolean isPresent = false; + for (JetImportDirective directive : importDirectives) { + if (directive.getText().endsWith(typeFullName) || + directive.getText().endsWith(typeFullName + ";")) { + isPresent = true; + } + } + if (!isPresent) { + JetImportDirective lastDirective = importDirectives.get(importDirectives.size() - 1); + lastDirective.getParent().addAfter(newDirective, lastDirective); + lastDirective.getParent().addAfter(JetPsiFactory.createWhiteSpace(element.getProject(), "\n"), lastDirective); + } + } + else { + List declarations = namespace.getDeclarations(); + assert !declarations.isEmpty(); + JetDeclaration firstDeclaration = declarations.iterator().next(); + firstDeclaration.getParent().addBefore(newDirective, firstDeclaration); + firstDeclaration.getParent().addBefore(JetPsiFactory.createWhiteSpace(element.getProject(), "\n\n"), firstDeclaration); + } + element.replace(newElement); + parent.replace(namespace); + } +} diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/IntentionActionForPsiElement.java b/idea/src/org/jetbrains/jet/plugin/quickfix/IntentionActionForPsiElement.java deleted file mode 100644 index 899b9105769..00000000000 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/IntentionActionForPsiElement.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.jetbrains.jet.plugin.quickfix; - -import com.intellij.codeInsight.intention.IntentionAction; -import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiFile; -import org.jetbrains.annotations.NotNull; - -/** -* @author svtk -*/ -public abstract class IntentionActionForPsiElement implements IntentionAction { - protected @NotNull T element; - - public IntentionActionForPsiElement(@NotNull T element) { - this.element = element; - } - - @Override - public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) { - return element.isValid(); - } - - @Override - public boolean startInWriteAction() { - return true; - } -} diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/JetIntentionAction.java b/idea/src/org/jetbrains/jet/plugin/quickfix/JetIntentionAction.java new file mode 100644 index 00000000000..df6670a19c9 --- /dev/null +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/JetIntentionAction.java @@ -0,0 +1,46 @@ +package org.jetbrains.jet.plugin.quickfix; + +import com.intellij.codeInsight.intention.IntentionAction; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.diagnostics.Diagnostic; +import org.jetbrains.jet.lang.diagnostics.DiagnosticParameter; +import org.jetbrains.jet.lang.diagnostics.DiagnosticWithParameters; + +import java.util.Arrays; + +/** +* @author svtk +*/ +public abstract class JetIntentionAction implements IntentionAction { + protected @NotNull T element; + + public JetIntentionAction(@NotNull T element) { + this.element = element; + } + + @Override + public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) { + return element.isValid(); + } + + @Override + public boolean startInWriteAction() { + return true; + } + + public static DiagnosticWithParameters assertAndCastToDiagnosticWithParameters(Diagnostic diagnostic, DiagnosticParameter... parameters) { + assert diagnostic instanceof DiagnosticWithParameters : + "For this type of quick fix diagnostic with additional " + + (parameters.length == 1 ? "parameter '" + parameters[0] + "'" : "parameters " + Arrays.asList(parameters)) + " is expected"; + + for (DiagnosticParameter parameter : parameters) { + assert ((DiagnosticWithParameters) diagnostic).hasParameter(parameter) : + "For this type of quick fix diagnostic with additional parameter '" + parameter + "' is expected"; + } + return (DiagnosticWithParameters) diagnostic; + } +} diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/IntentionActionFactory.java b/idea/src/org/jetbrains/jet/plugin/quickfix/JetIntentionActionFactory.java similarity index 53% rename from idea/src/org/jetbrains/jet/plugin/quickfix/IntentionActionFactory.java rename to idea/src/org/jetbrains/jet/plugin/quickfix/JetIntentionActionFactory.java index 482449b559c..58e7296750d 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/IntentionActionFactory.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/JetIntentionActionFactory.java @@ -6,8 +6,8 @@ import org.jetbrains.jet.lang.diagnostics.DiagnosticWithPsiElement; /** * @author svtk */ -public interface IntentionActionFactory { +public interface JetIntentionActionFactory { - IntentionActionForPsiElement createAction(DiagnosticWithPsiElement diagnostic); + JetIntentionAction createAction(DiagnosticWithPsiElement diagnostic); } diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/ModifierFix.java b/idea/src/org/jetbrains/jet/plugin/quickfix/ModifierFix.java index e3db2b5b660..347dfb2aaed 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/ModifierFix.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/ModifierFix.java @@ -9,7 +9,7 @@ import org.jetbrains.jet.lexer.JetKeywordToken; /** * @author svtk */ -public abstract class ModifierFix extends IntentionActionForPsiElement { +public abstract class ModifierFix extends JetIntentionAction { protected final JetKeywordToken modifier; protected ModifierFix(@NotNull JetModifierListOwner element, JetKeywordToken modifier) { diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixUtil.java b/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixUtil.java index 1f59c5641b3..31cd3fa058d 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixUtil.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixUtil.java @@ -1,7 +1,8 @@ package org.jetbrains.jet.plugin.quickfix; import com.intellij.psi.PsiElement; -import org.jetbrains.jet.lang.diagnostics.DiagnosticWithAdditionalInfo; +import org.jetbrains.jet.lang.diagnostics.DiagnosticParameter; +import org.jetbrains.jet.lang.diagnostics.DiagnosticWithParameters; import org.jetbrains.jet.lang.diagnostics.DiagnosticWithPsiElement; import org.jetbrains.jet.lang.diagnostics.DiagnosticWithPsiElementImpl; @@ -11,20 +12,13 @@ import org.jetbrains.jet.lang.diagnostics.DiagnosticWithPsiElementImpl; public class QuickFixUtil { private QuickFixUtil() {} - public static IntentionActionFactory createFactoryRedirectingAdditionalInfoToAnotherFactory(final IntentionActionFactory factory) { - return new IntentionActionFactory() { + public static JetIntentionActionFactory createFactoryRedirectingAdditionalInfoToAnotherFactory(final JetIntentionActionFactory factory, final DiagnosticParameter parameter) { + return new JetIntentionActionFactory() { @Override - public IntentionActionForPsiElement createAction(DiagnosticWithPsiElement diagnostic) { - //no type check; should be followed manually - assert diagnostic instanceof DiagnosticWithAdditionalInfo; - Object info = ((DiagnosticWithAdditionalInfo) diagnostic).getInfo(); - T element = null; - try { - element = (T) info; - } - catch (ClassCastException ex) { - assert false : ex; - } + public JetIntentionAction createAction(DiagnosticWithPsiElement diagnostic) { + + DiagnosticWithParameters diagnosticWithParameters = JetIntentionAction.assertAndCastToDiagnosticWithParameters(diagnostic, parameter); + T element = diagnosticWithParameters.getParameter(parameter); return factory.createAction(new DiagnosticWithPsiElementImpl(diagnostic.getFactory(), diagnostic.getSeverity(), diagnostic.getMessage(), element)); } }; diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixes.java b/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixes.java index be85717c4b2..33704a2da42 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixes.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixes.java @@ -3,6 +3,7 @@ package org.jetbrains.jet.plugin.quickfix; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import com.intellij.psi.PsiElement; +import org.jetbrains.jet.lang.diagnostics.DiagnosticParameters; import org.jetbrains.jet.lang.diagnostics.Errors; import org.jetbrains.jet.lang.diagnostics.PsiElementOnlyDiagnosticFactory; import org.jetbrains.jet.lang.psi.JetFunctionOrPropertyAccessor; @@ -18,26 +19,26 @@ import java.util.Collection; * @author svtk */ public class QuickFixes { - private static final Multimap actionMap = HashMultimap.create(); + private static final Multimap actionMap = HashMultimap.create(); - public static Collection get(PsiElementOnlyDiagnosticFactory diagnosticFactory) { + public static Collection get(PsiElementOnlyDiagnosticFactory diagnosticFactory) { return actionMap.get(diagnosticFactory); } private QuickFixes() {} - private static void add(PsiElementOnlyDiagnosticFactory diagnosticFactory, IntentionActionFactory actionFactory) { + private static void add(PsiElementOnlyDiagnosticFactory diagnosticFactory, JetIntentionActionFactory actionFactory) { actionMap.put(diagnosticFactory, actionFactory); } static { - IntentionActionFactory removeAbstractModifierFactory = RemoveModifierFix.createFactory(JetTokens.ABSTRACT_KEYWORD); - IntentionActionFactory addAbstractModifierFactory = AddModifierFix.createFactory(JetTokens.ABSTRACT_KEYWORD, new JetToken[]{JetTokens.OPEN_KEYWORD}, new JetToken[] {JetTokens.FINAL_KEYWORD}); + JetIntentionActionFactory removeAbstractModifierFactory = RemoveModifierFix.createFactory(JetTokens.ABSTRACT_KEYWORD); + JetIntentionActionFactory addAbstractModifierFactory = AddModifierFix.createFactory(JetTokens.ABSTRACT_KEYWORD, new JetToken[]{JetTokens.OPEN_KEYWORD}, new JetToken[] {JetTokens.FINAL_KEYWORD}); add(Errors.ABSTRACT_PROPERTY_IN_PRIMARY_CONSTRUCTOR_PARAMETERS, removeAbstractModifierFactory); add(Errors.ABSTRACT_PROPERTY_NOT_IN_CLASS, removeAbstractModifierFactory); - IntentionActionFactory removePartsFromPropertyFactory = RemovePartsFromPropertyFix.createFactory(); + JetIntentionActionFactory removePartsFromPropertyFactory = RemovePartsFromPropertyFix.createFactory(); add(Errors.ABSTRACT_PROPERTY_WITH_INITIALIZER, removeAbstractModifierFactory); add(Errors.ABSTRACT_PROPERTY_WITH_INITIALIZER, removePartsFromPropertyFactory); @@ -47,21 +48,23 @@ public class QuickFixes { add(Errors.ABSTRACT_PROPERTY_WITH_SETTER, removeAbstractModifierFactory); add(Errors.ABSTRACT_PROPERTY_WITH_SETTER, removePartsFromPropertyFactory); + add(Errors.PROPERTY_INITIALIZER_IN_TRAIT, removePartsFromPropertyFactory); + add(Errors.MUST_BE_INITIALIZED_OR_BE_ABSTRACT, addAbstractModifierFactory); add(Errors.REDUNDANT_ABSTRACT, removeAbstractModifierFactory); - IntentionActionFactory addAbstractToClassFactory = QuickFixUtil.createFactoryRedirectingAdditionalInfoToAnotherFactory(addAbstractModifierFactory); + JetIntentionActionFactory addAbstractToClassFactory = QuickFixUtil.createFactoryRedirectingAdditionalInfoToAnotherFactory(addAbstractModifierFactory, DiagnosticParameters.CLASS); add(Errors.ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS, removeAbstractModifierFactory); add(Errors.ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS, addAbstractToClassFactory); - IntentionActionFactory removeFunctionBodyFactory = RemoveFunctionBodyFix.createFactory(); + JetIntentionActionFactory removeFunctionBodyFactory = RemoveFunctionBodyFix.createFactory(); add(Errors.ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS, removeAbstractModifierFactory); add(Errors.ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS, addAbstractToClassFactory); add(Errors.ABSTRACT_FUNCTION_WITH_BODY, removeAbstractModifierFactory); add(Errors.ABSTRACT_FUNCTION_WITH_BODY, removeFunctionBodyFactory); - IntentionActionFactory addFunctionBodyFactory = AddFunctionBodyFix.createFactory(); + JetIntentionActionFactory addFunctionBodyFactory = AddFunctionBodyFix.createFactory(); add(Errors.NON_ABSTRACT_FUNCTION_WITH_NO_BODY, addAbstractModifierFactory); add(Errors.NON_ABSTRACT_FUNCTION_WITH_NO_BODY, addFunctionBodyFactory); @@ -77,7 +80,7 @@ public class QuickFixes { add(Errors.USELESS_CAST_STATIC_ASSERT_IS_FINE, ReplaceOperationInBinaryExpressionFix.createChangeCastToStaticAssertFactory()); add(Errors.USELESS_CAST, RemoveRightPartOfBinaryExpressionFix.createRemoveCastFactory()); - IntentionActionFactory changeAccessorTypeFactory = ChangeAccessorTypeFix.createFactory(); + JetIntentionActionFactory changeAccessorTypeFactory = ChangeAccessorTypeFix.createFactory(); add(Errors.WRONG_SETTER_PARAMETER_TYPE, changeAccessorTypeFactory); add(Errors.WRONG_GETTER_RETURN_TYPE, changeAccessorTypeFactory); diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/RemoveFunctionBodyFix.java b/idea/src/org/jetbrains/jet/plugin/quickfix/RemoveFunctionBodyFix.java index b58fadef529..4b7bb7fd187 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/RemoveFunctionBodyFix.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/RemoveFunctionBodyFix.java @@ -9,12 +9,11 @@ import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.diagnostics.DiagnosticWithPsiElement; import org.jetbrains.jet.lang.psi.*; -import org.jetbrains.jet.lexer.JetTokens; /** * @author svtk */ -public class RemoveFunctionBodyFix extends IntentionActionForPsiElement { +public class RemoveFunctionBodyFix extends JetIntentionAction { public RemoveFunctionBodyFix(@NotNull JetFunctionOrPropertyAccessor element) { super(element); @@ -52,10 +51,10 @@ public class RemoveFunctionBodyFix extends IntentionActionForPsiElement createFactory() { - return new IntentionActionFactory() { + public static JetIntentionActionFactory createFactory() { + return new JetIntentionActionFactory() { @Override - public IntentionActionForPsiElement createAction(DiagnosticWithPsiElement diagnostic) { + public JetIntentionAction createAction(DiagnosticWithPsiElement diagnostic) { assert diagnostic.getPsiElement() instanceof JetFunctionOrPropertyAccessor; return new RemoveFunctionBodyFix((JetFunctionOrPropertyAccessor) diagnostic.getPsiElement()); } diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/RemoveModifierFix.java b/idea/src/org/jetbrains/jet/plugin/quickfix/RemoveModifierFix.java index 99fd068f5d3..5c6379f384d 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/RemoveModifierFix.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/RemoveModifierFix.java @@ -86,10 +86,10 @@ public class RemoveModifierFix extends ModifierFix { return false; } - public static IntentionActionFactory createFactory(final JetKeywordToken modifier) { - return new IntentionActionFactory() { + public static JetIntentionActionFactory createFactory(final JetKeywordToken modifier) { + return new JetIntentionActionFactory() { @Override - public IntentionActionForPsiElement createAction(DiagnosticWithPsiElement diagnostic) { + public JetIntentionAction createAction(DiagnosticWithPsiElement diagnostic) { assert diagnostic.getPsiElement() instanceof JetModifierListOwner; return new RemoveModifierFix((JetModifierListOwner) diagnostic.getPsiElement(), modifier); } diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/RemovePartsFromPropertyFix.java b/idea/src/org/jetbrains/jet/plugin/quickfix/RemovePartsFromPropertyFix.java index b6878c0685e..2b4675c931c 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/RemovePartsFromPropertyFix.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/RemovePartsFromPropertyFix.java @@ -6,21 +6,28 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.diagnostics.DiagnosticWithAdditionalInfo; +import org.jetbrains.jet.lang.diagnostics.DiagnosticParameters; +import org.jetbrains.jet.lang.diagnostics.DiagnosticWithParameters; import org.jetbrains.jet.lang.diagnostics.DiagnosticWithPsiElement; import org.jetbrains.jet.lang.psi.*; +import org.jetbrains.jet.lang.types.DeferredType; import org.jetbrains.jet.lang.types.JetType; /** * @author svtk */ -public class RemovePartsFromPropertyFix extends IntentionActionForPsiElement { +public class RemovePartsFromPropertyFix extends JetIntentionAction { private final JetType type; private final String partsToRemove; private RemovePartsFromPropertyFix(@NotNull JetProperty element, JetType type) { super(element); - this.type = type; + if (type instanceof DeferredType) { + this.type = ((DeferredType) type).getActualType(); + } + else { + this.type = type; + } partsToRemove = partsToRemove(element.getGetter() != null && element.getGetter().getBodyExpression() != null, element.getSetter() != null && element.getSetter().getBodyExpression() != null, element.getInitializer() != null); @@ -78,6 +85,7 @@ public class RemovePartsFromPropertyFix extends IntentionActionForPsiElement createFactory() { - return new IntentionActionFactory() { + public static JetIntentionActionFactory createFactory() { + return new JetIntentionActionFactory() { @Override - public IntentionActionForPsiElement createAction(DiagnosticWithPsiElement diagnostic) { + public JetIntentionAction createAction(DiagnosticWithPsiElement diagnostic) { assert diagnostic.getPsiElement() instanceof JetProperty; - assert diagnostic instanceof DiagnosticWithAdditionalInfo; - - Object info = ((DiagnosticWithAdditionalInfo) diagnostic).getInfo(); - assert info instanceof JetType; - return new RemovePartsFromPropertyFix((JetProperty) diagnostic.getPsiElement(), (JetType) info); + DiagnosticWithParameters diagnosticWithParameters = assertAndCastToDiagnosticWithParameters(diagnostic, DiagnosticParameters.TYPE); + JetType type = diagnosticWithParameters.getParameter(DiagnosticParameters.TYPE); + return new RemovePartsFromPropertyFix((JetProperty) diagnostic.getPsiElement(), type); } }; } diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/RemoveRedundantModifierFix.java b/idea/src/org/jetbrains/jet/plugin/quickfix/RemoveRedundantModifierFix.java index 348c0a7886a..4c895b3ebcf 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/RemoveRedundantModifierFix.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/RemoveRedundantModifierFix.java @@ -2,10 +2,12 @@ package org.jetbrains.jet.plugin.quickfix; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.diagnostics.DiagnosticWithAdditionalInfo; +import org.jetbrains.jet.lang.diagnostics.DiagnosticParameters; +import org.jetbrains.jet.lang.diagnostics.DiagnosticWithParameters; import org.jetbrains.jet.lang.diagnostics.DiagnosticWithPsiElement; import org.jetbrains.jet.lang.psi.JetModifierList; import org.jetbrains.jet.lexer.JetKeywordToken; @@ -13,7 +15,7 @@ import org.jetbrains.jet.lexer.JetKeywordToken; /** * @author svtk */ -public class RemoveRedundantModifierFix extends IntentionActionForPsiElement { +public class RemoveRedundantModifierFix extends JetIntentionAction { private JetKeywordToken redundantModifier; public RemoveRedundantModifierFix(@NotNull JetModifierList element, @NotNull JetKeywordToken redundantModifier) { super(element); @@ -38,15 +40,14 @@ public class RemoveRedundantModifierFix extends IntentionActionForPsiElement createFactory() { - return new IntentionActionFactory() { + public static JetIntentionActionFactory createFactory() { + return new JetIntentionActionFactory() { @Override - public IntentionActionForPsiElement createAction(DiagnosticWithPsiElement diagnostic) { + public JetIntentionAction createAction(DiagnosticWithPsiElement diagnostic) { assert diagnostic.getPsiElement() instanceof JetModifierList; - assert diagnostic instanceof DiagnosticWithAdditionalInfo; - Object info = ((DiagnosticWithAdditionalInfo) diagnostic).getInfo(); - assert info instanceof JetKeywordToken; - return new RemoveRedundantModifierFix((JetModifierList) diagnostic.getPsiElement(), (JetKeywordToken) info); + DiagnosticWithParameters diagnosticWithParameters = assertAndCastToDiagnosticWithParameters(diagnostic, DiagnosticParameters.MODIFIER); + JetKeywordToken modifier = diagnosticWithParameters.getParameter(DiagnosticParameters.MODIFIER); + return new RemoveRedundantModifierFix((JetModifierList) diagnostic.getPsiElement(), modifier); } }; } diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/RemoveRightPartOfBinaryExpressionFix.java b/idea/src/org/jetbrains/jet/plugin/quickfix/RemoveRightPartOfBinaryExpressionFix.java index 8be4f3a848b..61b72d624c9 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/RemoveRightPartOfBinaryExpressionFix.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/RemoveRightPartOfBinaryExpressionFix.java @@ -13,7 +13,7 @@ import org.jetbrains.jet.lang.psi.JetExpression; /** * @author svtk */ -public abstract class RemoveRightPartOfBinaryExpressionFix extends IntentionActionForPsiElement { +public abstract class RemoveRightPartOfBinaryExpressionFix extends JetIntentionAction { public RemoveRightPartOfBinaryExpressionFix(@NotNull T element) { super(element); } @@ -36,10 +36,10 @@ public abstract class RemoveRightPartOfBinaryExpressionFix createRemoveCastFactory() { - return new IntentionActionFactory() { + public static JetIntentionActionFactory createRemoveCastFactory() { + return new JetIntentionActionFactory() { @Override - public IntentionActionForPsiElement createAction(DiagnosticWithPsiElement diagnostic) { + public JetIntentionAction createAction(DiagnosticWithPsiElement diagnostic) { assert diagnostic.getPsiElement() instanceof JetBinaryExpressionWithTypeRHS; return new RemoveRightPartOfBinaryExpressionFix((JetBinaryExpressionWithTypeRHS) diagnostic.getPsiElement()) { @NotNull @@ -52,10 +52,10 @@ public abstract class RemoveRightPartOfBinaryExpressionFix createRemoveElvisOperatorFactory() { - return new IntentionActionFactory() { + public static JetIntentionActionFactory createRemoveElvisOperatorFactory() { + return new JetIntentionActionFactory() { @Override - public IntentionActionForPsiElement createAction(DiagnosticWithPsiElement diagnostic) { + public JetIntentionAction createAction(DiagnosticWithPsiElement diagnostic) { assert diagnostic.getPsiElement() instanceof JetBinaryExpression; return new RemoveRightPartOfBinaryExpressionFix((JetBinaryExpression) diagnostic.getPsiElement()) { @NotNull diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/ReplaceOperationInBinaryExpressionFix.java b/idea/src/org/jetbrains/jet/plugin/quickfix/ReplaceOperationInBinaryExpressionFix.java index 640183a69e6..14231b22689 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/ReplaceOperationInBinaryExpressionFix.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/ReplaceOperationInBinaryExpressionFix.java @@ -14,7 +14,7 @@ import org.jetbrains.jet.lang.psi.JetPsiFactory; /** * @author svtk */ -public abstract class ReplaceOperationInBinaryExpressionFix extends IntentionActionForPsiElement { +public abstract class ReplaceOperationInBinaryExpressionFix extends JetIntentionAction { private final String expressionWithNecessaryOperation; public ReplaceOperationInBinaryExpressionFix(@NotNull T element, String expressionWithNecessaryOperation) { super(element); @@ -39,10 +39,10 @@ public abstract class ReplaceOperationInBinaryExpressionFix createChangeCastToStaticAssertFactory() { - return new IntentionActionFactory() { + public static JetIntentionActionFactory createChangeCastToStaticAssertFactory() { + return new JetIntentionActionFactory() { @Override - public IntentionActionForPsiElement createAction(DiagnosticWithPsiElement diagnostic) { + public JetIntentionAction createAction(DiagnosticWithPsiElement diagnostic) { assert diagnostic.getPsiElement() instanceof JetBinaryExpressionWithTypeRHS; return new ReplaceOperationInBinaryExpressionFix((JetBinaryExpressionWithTypeRHS) diagnostic.getPsiElement(), "2 : Int") { @NotNull diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/ReplaceSafeCallToDotCall.java b/idea/src/org/jetbrains/jet/plugin/quickfix/ReplaceSafeCallToDotCall.java index e7be969f17b..9f6f3016f8e 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/ReplaceSafeCallToDotCall.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/ReplaceSafeCallToDotCall.java @@ -12,7 +12,7 @@ import org.jetbrains.jet.lang.psi.*; /** * @author svtk */ -public class ReplaceSafeCallToDotCall extends IntentionActionForPsiElement { +public class ReplaceSafeCallToDotCall extends JetIntentionAction { public ReplaceSafeCallToDotCall(@NotNull JetElement element) { super(element); @@ -36,6 +36,7 @@ public class ReplaceSafeCallToDotCall extends IntentionActionForPsiElement createFactory() { - return new IntentionActionFactory() { + public static JetIntentionActionFactory createFactory() { + return new JetIntentionActionFactory() { @Override - public IntentionActionForPsiElement createAction(DiagnosticWithPsiElement diagnostic) { + public JetIntentionAction createAction(DiagnosticWithPsiElement diagnostic) { assert diagnostic.getPsiElement() instanceof JetElement; return new ReplaceSafeCallToDotCall((JetElement) diagnostic.getPsiElement()); } diff --git a/idea/tests/org/jetbrains/jet/types/JetDefaultModalityModifiersTest.java b/idea/tests/org/jetbrains/jet/types/JetDefaultModalityModifiersTest.java index 6cbf896ed52..2eb81e3b963 100644 --- a/idea/tests/org/jetbrains/jet/types/JetDefaultModalityModifiersTest.java +++ b/idea/tests/org/jetbrains/jet/types/JetDefaultModalityModifiersTest.java @@ -349,59 +349,52 @@ public class JetDefaultModalityModifiersTest extends LightDaemonAnalyzerTestCase tc.testPropertyAccessorModalityInClass("class A : C { final override val a: Int = 0 }", Modality.FINAL); tc.testPropertyAccessorModalityInClass("class A : C { final override val a: Int = 0; get }", Modality.FINAL); tc.testPropertyAccessorModalityInClass("class A : C { final override val a: Int = 0; final get }", Modality.FINAL); + tc.testPropertyAccessorModalityInClass("class A : C { final override val a: Int = 0; override get() = 2 }", Modality.OPEN); tc.testPropertyAccessorModalityInClass("open class A : C { override val a: Int = 0 }", Modality.OPEN); tc.testPropertyAccessorModalityInClass("open class A : C { override val a: Int = 0; get }", Modality.OPEN); tc.testPropertyAccessorModalityInClass("open class A : C { override val a: Int = 0; open get }", Modality.OPEN); tc.testPropertyAccessorModalityInClass("open class A : C { override val a: Int = 0; final get }", Modality.FINAL); + tc.testPropertyAccessorModalityInClass("open class A : C { override val a: Int = 0; override get() = 2 }", Modality.OPEN); + tc.testPropertyAccessorModalityInClass("open class A : C { override val a: Int = 0; final override get() = 2 }", Modality.FINAL); tc.testPropertyAccessorModalityInClass("open class A : C { open override val a: Int = 0 }", Modality.OPEN); tc.testPropertyAccessorModalityInClass("open class A : C { open override val a: Int = 0; get }", Modality.OPEN); tc.testPropertyAccessorModalityInClass("open class A : C { open override val a: Int = 0; open get }", Modality.OPEN); tc.testPropertyAccessorModalityInClass("open class A : C { open override val a: Int = 0; final get }", Modality.FINAL); + tc.testPropertyAccessorModalityInClass("open class A : C { open override val a: Int = 0; override get() = 2 }", Modality.OPEN); + tc.testPropertyAccessorModalityInClass("open class A : C { open override val a: Int = 0; final override get() = 2 }", Modality.FINAL); tc.testPropertyAccessorModalityInClass("open class A : C { final override val a: Int = 0 }", Modality.FINAL); tc.testPropertyAccessorModalityInClass("open class A : C { final override val a: Int = 0; get }", Modality.FINAL); tc.testPropertyAccessorModalityInClass("open class A : C { final override val a: Int = 0; final get }", Modality.FINAL); + tc.testPropertyAccessorModalityInClass("open class A : C { final override val a: Int = 0; override get() = 2 }", Modality.OPEN); + tc.testPropertyAccessorModalityInClass("open class A : C { final override val a: Int = 0; final override get() = 2 }", Modality.FINAL); + + tc.testPropertyAccessorModalityInClass("abstract class A : C { abstract override val a: Int }", Modality.ABSTRACT); + tc.testPropertyAccessorModalityInClass("abstract class A : C { abstract override val a: Int get }", Modality.ABSTRACT); + tc.testPropertyAccessorModalityInClass("abstract class A : C { abstract override val a: Int open get }", Modality.ABSTRACT); + tc.testPropertyAccessorModalityInClass("abstract class A : C { abstract override val a: Int abstract get }", Modality.ABSTRACT); + tc.testPropertyAccessorModalityInClass("abstract class A : C { override val a: Int override get() = 10 }", Modality.OPEN); + tc.testPropertyAccessorModalityInClass("abstract class A : C { override val a: Int open override get() = 10 }", Modality.OPEN); + tc.testPropertyAccessorModalityInClass("abstract class A : C { override val a: Int final override get() = 10 }", Modality.FINAL); + + tc.testPropertyAccessorModalityInClass("abstract class A : C { open abstract override val a: Int }", Modality.ABSTRACT); + tc.testPropertyAccessorModalityInClass("abstract class A : C { open abstract override val a: Int get }", Modality.ABSTRACT); + tc.testPropertyAccessorModalityInClass("abstract class A : C { open abstract override val a: Int open get }", Modality.ABSTRACT); + tc.testPropertyAccessorModalityInClass("abstract class A : C { open abstract override val a: Int abstract get }", Modality.ABSTRACT); + tc.testPropertyAccessorModalityInClass("abstract class A : C { open override val a: Int override get() = 10 }", Modality.OPEN); + tc.testPropertyAccessorModalityInClass("abstract class A : C { open override val a: Int open override get() = 10 }", Modality.OPEN); + tc.testPropertyAccessorModalityInClass("abstract class A : C { open override val a: Int final override get() = 10 }", Modality.FINAL); tc.testPropertyAccessorModalityInTrait("trait A : C { override val a: Int }", Modality.ABSTRACT); - tc.testPropertyAccessorModalityInTrait("trait A : C { override val a: Int = 0; get }", Modality.OPEN); - - tc.testPropertyAccessorModalityInTrait("trait A : C { abstract override val a: Int }", Modality.ABSTRACT); - tc.testPropertyAccessorModalityInTrait("trait A : C { abstract override val a: Int get }", Modality.ABSTRACT); - - tc.testPropertyAccessorModalityInClass("abstract class A { abstract override val a: Int }", Modality.ABSTRACT); - tc.testPropertyAccessorModalityInClass("abstract class A { abstract override val a: Int get }", Modality.ABSTRACT); - tc.testPropertyAccessorModalityInClass("abstract class A { abstract override val a: Int open get }", Modality.ABSTRACT); - tc.testPropertyAccessorModalityInClass("abstract class A { abstract override val a: Int abstract get }", Modality.ABSTRACT); - tc.testPropertyAccessorModalityInClass("abstract class A { override val a: Int get() = 10 }", Modality.OPEN); - tc.testPropertyAccessorModalityInClass("abstract class A { override val a: Int open get() = 10 }", Modality.OPEN); - tc.testPropertyAccessorModalityInClass("abstract class A { override val a: Int final get() = 10 }", Modality.FINAL); - - tc.testPropertyAccessorModalityInClass("abstract class A { open abstract override val a: Int }", Modality.ABSTRACT); - tc.testPropertyAccessorModalityInClass("abstract class A { open abstract override val a: Int get }", Modality.ABSTRACT); - tc.testPropertyAccessorModalityInClass("abstract class A { open abstract override val a: Int open get }", Modality.ABSTRACT); - tc.testPropertyAccessorModalityInClass("abstract class A { open abstract override val a: Int abstract get }", Modality.ABSTRACT); - tc.testPropertyAccessorModalityInClass("abstract class A { open override val a: Int get() = 10 }", Modality.OPEN); - tc.testPropertyAccessorModalityInClass("abstract class A { open override val a: Int open get() = 10 }", Modality.OPEN); - tc.testPropertyAccessorModalityInClass("abstract class A { open override val a: Int final get() = 10 }", Modality.FINAL); - - tc.testPropertyAccessorModalityInTrait("trait A { override val a: Int }", Modality.ABSTRACT); - tc.testPropertyAccessorModalityInTrait("trait A { override val a: Int get }", Modality.ABSTRACT); - tc.testPropertyAccessorModalityInTrait("trait A { override val a: Int get() = 1 }", Modality.OPEN); - tc.testPropertyAccessorModalityInTrait("trait A { override val a: Int abstract get }", Modality.ABSTRACT); - tc.testPropertyAccessorModalityInTrait("trait A { override val a: Int open get }", Modality.ABSTRACT); - tc.testPropertyAccessorModalityInTrait("trait A { override val a: Int open get() = 1 }", Modality.OPEN); - tc.testPropertyAccessorModalityInTrait("trait A { override val a: Int final get }", Modality.FINAL); - tc.testPropertyAccessorModalityInTrait("trait A { override val a: Int final get() = 1 }", Modality.FINAL); - - tc.testPropertyAccessorModalityInTrait("abstract trait A { override val a: Int }", Modality.ABSTRACT); - tc.testPropertyAccessorModalityInTrait("abstract trait A { override val a: Int get }", Modality.ABSTRACT); - tc.testPropertyAccessorModalityInTrait("abstract trait A { override val a: Int get() = 1 }", Modality.OPEN); - tc.testPropertyAccessorModalityInTrait("abstract trait A { override val a: Int abstract get }", Modality.ABSTRACT); - tc.testPropertyAccessorModalityInTrait("abstract trait A { override val a: Int open get }", Modality.ABSTRACT); - tc.testPropertyAccessorModalityInTrait("abstract trait A { override val a: Int open get() = 1 }", Modality.OPEN); - tc.testPropertyAccessorModalityInTrait("abstract trait A { override val a: Int final get }", Modality.FINAL); - tc.testPropertyAccessorModalityInTrait("abstract trait A { override val a: Int final get() = 1 }", Modality.FINAL); + tc.testPropertyAccessorModalityInTrait("trait A : C { override val a: Int get }", Modality.ABSTRACT); + tc.testPropertyAccessorModalityInTrait("trait A : C { override val a: Int override get() = 1 }", Modality.OPEN); + tc.testPropertyAccessorModalityInTrait("trait A : C { override val a: Int abstract get }", Modality.ABSTRACT); + tc.testPropertyAccessorModalityInTrait("trait A : C { override val a: Int open get }", Modality.ABSTRACT); + tc.testPropertyAccessorModalityInTrait("trait A : C { override val a: Int open override get() = 1 }", Modality.OPEN); + tc.testPropertyAccessorModalityInTrait("trait A : C { override val a: Int override get() = 1 }", Modality.OPEN); + tc.testPropertyAccessorModalityInTrait("trait A : C { override val a: Int final get }", Modality.FINAL); + tc.testPropertyAccessorModalityInTrait("trait A : C { override val a: Int final override get() = 1 }", Modality.FINAL); } }