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 d5abd98d3af..f1bdceb1172 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -122,6 +122,7 @@ public interface Errors { DiagnosticWithParameterFactory NON_FINAL_MEMBER_IN_FINAL_CLASS = DiagnosticWithParameterFactory.create(ERROR, "Non final member in a final class", DiagnosticParameters.CLASS); DiagnosticWithParameterFactory NON_FINAL_ACCESSOR_OF_FINAL_PROPERTY = DiagnosticWithParameterFactory.create(ERROR, "Non final accessor of a final property", DiagnosticParameters.PROPERTY); + DiagnosticWithParameterFactory ABSTRACT_ACCESSOR_OF_NON_ABSTRACT_PROPERTY = DiagnosticWithParameterFactory.create(ERROR, "Abstract accessor of a non abstract property", DiagnosticParameters.PROPERTY); SimpleDiagnosticFactory PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT = SimpleDiagnosticFactory.create(ERROR, "Projections are not allowed on type arguments of functions and properties"); // TODO : better positioning SimpleDiagnosticFactory SUPERTYPE_NOT_INITIALIZED = SimpleDiagnosticFactory.create(ERROR, "This type has a constructor, and thus must be initialized here"); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java index 844c7d62671..5e6a291fe84 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java @@ -128,7 +128,7 @@ public class DeclarationsChecker { } } - protected void checkProperty(JetProperty property, PropertyDescriptor propertyDescriptor) { + private void checkProperty(JetProperty property, PropertyDescriptor propertyDescriptor) { DeclarationDescriptor containingDeclaration = propertyDescriptor.getContainingDeclaration(); ClassDescriptor classDescriptor = (containingDeclaration instanceof ClassDescriptor) ? (ClassDescriptor) containingDeclaration @@ -287,6 +287,10 @@ public class DeclarationsChecker { ASTNode openModifierNode = accessor.getModifierList().getModifierNode(JetTokens.OPEN_KEYWORD); context.getTrace().report(NON_FINAL_ACCESSOR_OF_FINAL_PROPERTY.on(accessor, openModifierNode, property)); } + if (propertyDescriptor.getModality() != Modality.ABSTRACT && accessor.hasModifier(JetTokens.ABSTRACT_KEYWORD)) { + ASTNode abstractModifierNode = accessor.getModifierList().getModifierNode(JetTokens.ABSTRACT_KEYWORD); + context.getTrace().report(ABSTRACT_ACCESSOR_OF_NON_ABSTRACT_PROPERTY.on(accessor, abstractModifierNode, property)); + } } } diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixes.java b/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixes.java index dc1bd99e2cc..c67c49bd977 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixes.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixes.java @@ -102,6 +102,9 @@ public class QuickFixes { add(Errors.NON_FINAL_MEMBER_IN_FINAL_CLASS, removeOpenModifierFactory); add(Errors.NON_FINAL_ACCESSOR_OF_FINAL_PROPERTY, QuickFixUtil.createFactoryRedirectingAdditionalInfoToAnotherFactory(addOpenModifierFactory, DiagnosticParameters.PROPERTY)); add(Errors.NON_FINAL_ACCESSOR_OF_FINAL_PROPERTY, removeOpenModifierFactory); + + add(Errors.ABSTRACT_ACCESSOR_OF_NON_ABSTRACT_PROPERTY, QuickFixUtil.createFactoryRedirectingAdditionalInfoToAnotherFactory(addAbstractModifierFactory, DiagnosticParameters.PROPERTY)); + add(Errors.ABSTRACT_ACCESSOR_OF_NON_ABSTRACT_PROPERTY, removeAbstractModifierFactory); } } diff --git a/idea/testData/checker/Abstract.jet b/idea/testData/checker/Abstract.jet index a004d179a5e..ca35e2bac53 100644 --- a/idea/testData/checker/Abstract.jet +++ b/idea/testData/checker/Abstract.jet @@ -27,21 +27,6 @@ class MyClass() { fun g() {} abstract fun h() abstract fun j() {} - - //property accessors - var i: Int abstract get abstract set - var i1: Int = 0; abstract get abstract set - - var j: Int get() = i; abstract set - var j1: Int = 0; get() = i; abstract set - - var k: Int abstract set - var k1: Int = 0; abstract set - - var l: Int abstract get abstract set - var l1: Int = 0; abstract get abstract set - - var n: Int abstract get abstract set(v: Int) {} } abstract class MyAbstractClass() { @@ -71,21 +56,6 @@ abstract class MyAbstractClass() { fun g() {} abstract fun h() abstract fun j() {} - - //property accessors - var i: Int abstract get abstract set - var i1: Int = 0; abstract get abstract set - - var j: Int get() = i; abstract set - var j1: Int get() = i; abstract set - - var k: Int abstract set - var k1: Int = 0; abstract set - - var l: Int abstract get abstract set - var l1: Int = 0; abstract get abstract set - - var n: Int abstract get abstract set(v: Int) {} } trait MyTrait { @@ -115,21 +85,6 @@ trait MyTrait { fun g() {} abstract fun h() abstract fun j() {} - - //property accessors - var i: Int abstract get abstract set - var i1: Int = 0; abstract get abstract set - - var j: Int get() = i; abstract set - var j1: Int = 0; get() = i; abstract set - - var k: Int abstract set - var k1: Int = 0; abstract set - - var l: Int abstract get abstract set - var l1: Int = 0; abstract get abstract set - - var n: Int abstract get abstract set(v: Int) {} } enum class MyEnum() { @@ -159,21 +114,6 @@ enum class MyEnum() { fun g() {} abstract fun h() abstract fun j() {} - - //property accessors - var i: Int abstract get abstract set - var i1: Int = 0; abstract get abstract set - - var j: Int get() = i; abstract set - var j1: Int = 0; get() = i; abstract set - - var k: Int abstract set - var k1: Int = 0; abstract set - - var l: Int abstract get abstract set - var l1: Int = 0; abstract get abstract set - - var n: Int abstract get abstract set(v: Int) {} } abstract enum class MyAbstractEnum() {} @@ -205,21 +145,6 @@ namespace MyNamespace { fun g() {} abstract fun h() abstract fun j() {} - - //property accessors - var i: Int abstract get abstract set - var i1: Int = 0; abstract get abstract set - - var j: Int get() = i; abstract set - var j1: Int = 0; get() = i; abstract set - - var k: Int abstract set - var k1: Int = 0; abstract set - - var l: Int abstract get abstract set - var l1: Int = 0; abstract get abstract set - - var n: Int abstract get abstract set(v: Int) {} } //creating an instance diff --git a/idea/testData/checker/infos/PropertiesWithBackingFields.jet b/idea/testData/checker/infos/PropertiesWithBackingFields.jet index 87409d71292..294ea276524 100644 --- a/idea/testData/checker/infos/PropertiesWithBackingFields.jet +++ b/idea/testData/checker/infos/PropertiesWithBackingFields.jet @@ -35,10 +35,10 @@ var v5 : Int get() = 1; set(x){$v5 = x} var v6 : Int get() = $v6 + 1; set(x){} - val v7 : Int abstract get - var v8 : Int abstract get abstract set - var v9 : Int abstract set - var v10 : Int abstract get + abstract val v7 : Int abstract get + abstract var v8 : Int abstract get abstract set + var v9 : Int set + var v10 : Int get } diff --git a/idea/testData/checker/regression/Jet67.jet b/idea/testData/checker/regression/Jet67.jet index 49a449094ec..7c2248a5f6a 100644 --- a/idea/testData/checker/regression/Jet67.jet +++ b/idea/testData/checker/regression/Jet67.jet @@ -1,4 +1,4 @@ abstract class XXX { - val a : Int abstract get + abstract val a : Int abstract get } diff --git a/idea/testData/checkerWithErrorTypes/full/Abstract.jet b/idea/testData/checkerWithErrorTypes/full/Abstract.jet index 113ff0a34d6..1d3420ce16d 100644 --- a/idea/testData/checkerWithErrorTypes/full/Abstract.jet +++ b/idea/testData/checkerWithErrorTypes/full/Abstract.jet @@ -29,19 +29,19 @@ class MyClass() { abstract fun j() {} //property accessors - var i: Int abstract get abstract set - var i1: Int = 0; abstract get abstract set + var i: Int abstract get abstract set + var i1: Int = 0; abstract get abstract set - var j: Int get() = i; abstract set - var j1: Int = 0; get() = i; abstract set + var j: Int get() = i; abstract set + var j1: Int = 0; get() = i; abstract set - var k: Int abstract set - var k1: Int = 0; abstract set + var k: Int abstract set + var k1: Int = 0; abstract set - var l: Int abstract get abstract set - var l1: Int = 0; abstract get abstract set + var l: Int abstract get abstract set + var l1: Int = 0; abstract get abstract set - var n: Int abstract get abstract set(v: Int) {} + var n: Int abstract get abstract set(v: Int) {} } abstract class MyAbstractClass() { @@ -73,19 +73,19 @@ abstract class MyAbstractClass() { abstract fun j() {} //property accessors - var i: Int abstract get abstract set - var i1: Int = 0; abstract get abstract set + var i: Int abstract get abstract set + var i1: Int = 0; abstract get abstract set - var j: Int get() = i; abstract set - var j1: Int get() = i; abstract set + var j: Int get() = i; abstract set + var j1: Int get() = i; abstract set - var k: Int abstract set - var k1: Int = 0; abstract set + var k: Int abstract set + var k1: Int = 0; abstract set - var l: Int abstract get abstract set - var l1: Int = 0; abstract get abstract set + var l: Int abstract get abstract set + var l1: Int = 0; abstract get abstract set - var n: Int abstract get abstract set(v: Int) {} + var n: Int abstract get abstract set(v: Int) {} } trait MyTrait { @@ -118,18 +118,18 @@ trait MyTrait { //property accessors var i: Int abstract get abstract set - var i1: Int = 0; abstract get abstract set + var i1: Int = 0; abstract get abstract set - var j: Int get() = i; abstract set - var j1: Int = 0; get() = i; abstract set + var j: Int get() = i; abstract set + var j1: Int = 0; get() = i; abstract set var k: Int abstract set - var k1: Int = 0; abstract set + var k1: Int = 0; abstract set var l: Int abstract get abstract set - var l1: Int = 0; abstract get abstract set + var l1: Int = 0; abstract get abstract set - var n: Int abstract get abstract set(v: Int) {} + var n: Int abstract get abstract set(v: Int) {} } enum class MyEnum() { @@ -161,19 +161,19 @@ enum class MyEnum() { abstract fun j() {} //property accessors - var i: Int abstract get abstract set - var i1: Int = 0; abstract get abstract set + var i: Int abstract get abstract set + var i1: Int = 0; abstract get abstract set - var j: Int get() = i; abstract set - var j1: Int = 0; get() = i; abstract set + var j: Int get() = i; abstract set + var j1: Int = 0; get() = i; abstract set - var k: Int abstract set - var k1: Int = 0; abstract set + var k: Int abstract set + var k1: Int = 0; abstract set - var l: Int abstract get abstract set - var l1: Int = 0; abstract get abstract set + var l: Int abstract get abstract set + var l1: Int = 0; abstract get abstract set - var n: Int abstract get abstract set(v: Int) {} + var n: Int abstract get abstract set(v: Int) {} } abstract enum class MyAbstractEnum() {} @@ -207,19 +207,19 @@ namespace MyNamespace { abstract fun j() {} //property accessors - var i: Int abstract get abstract set - var i1: Int = 0; abstract get abstract set + var i: Int abstract get abstract set + var i1: Int = 0; abstract get abstract set - var j: Int get() = i; abstract set - var j1: Int = 0; get() = i; abstract set + var j: Int get() = i; abstract set + var j1: Int = 0; get() = i; abstract set - var k: Int abstract set - var k1: Int = 0; abstract set + var k: Int abstract set + var k1: Int = 0; abstract set - var l: Int abstract get abstract set - var l1: Int = 0; abstract get abstract set + var l: Int abstract get abstract set + var l1: Int = 0; abstract get abstract set - var n: Int abstract get abstract set(v: Int) {} + var n: Int abstract get abstract set(v: Int) {} } //creating an instance diff --git a/idea/testData/checkerWithErrorTypes/full/IllegalModifiers.jet b/idea/testData/checkerWithErrorTypes/full/IllegalModifiers.jet index d719075de4b..9feae3696e1 100644 --- a/idea/testData/checkerWithErrorTypes/full/IllegalModifiers.jet +++ b/idea/testData/checkerWithErrorTypes/full/IllegalModifiers.jet @@ -4,6 +4,10 @@ abstract class A() { abstract final fun f() abstract open fun g() final open fun h() {} + + open var r: String + get + abstract protected set } final trait T {} @@ -14,4 +18,4 @@ class FinalClass() { open get(): Int = $i var j: Int = 1 open set(v: Int) {} -} +} \ No newline at end of file diff --git a/idea/testData/checkerWithErrorTypes/full/infos/PropertiesWithBackingFields.jet b/idea/testData/checkerWithErrorTypes/full/infos/PropertiesWithBackingFields.jet index cd4a142b85a..3f417b56418 100644 --- a/idea/testData/checkerWithErrorTypes/full/infos/PropertiesWithBackingFields.jet +++ b/idea/testData/checkerWithErrorTypes/full/infos/PropertiesWithBackingFields.jet @@ -35,10 +35,10 @@ abstract class Test() { var v5 : Int get() = 1; set(x){$v5 = x} var v6 : Int get() = $v6 + 1; set(x){} - val v7 : Int abstract get - var v8 : Int abstract get abstract set - var v9 : Int abstract set - var v10 : Int abstract get + abstract val v7 : Int abstract get + abstract var v8 : Int abstract get abstract set + var v9 : Int abstract set + var v10 : Int abstract get } diff --git a/idea/testData/checkerWithErrorTypes/full/regression/Jet67.jet b/idea/testData/checkerWithErrorTypes/full/regression/Jet67.jet index 49a449094ec..7c2248a5f6a 100644 --- a/idea/testData/checkerWithErrorTypes/full/regression/Jet67.jet +++ b/idea/testData/checkerWithErrorTypes/full/regression/Jet67.jet @@ -1,4 +1,4 @@ abstract class XXX { - val a : Int abstract get + abstract val a : Int abstract get }