提交 2ed7ecef 编写于 作者: A AlekseyTs

Merge pull request #5345 from AlekseyTs/Issue4696

Add C# language version check for read-only auto-properties.
...@@ -9161,6 +9161,15 @@ internal class CSharpResources { ...@@ -9161,6 +9161,15 @@ internal class CSharpResources {
} }
} }
/// <summary>
/// Looks up a localized string similar to readonly automatically implemented properties.
/// </summary>
internal static string IDS_FeatureReadonlyAutoImplementedProperties {
get {
return ResourceManager.GetString("IDS_FeatureReadonlyAutoImplementedProperties", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to static classes. /// Looks up a localized string similar to static classes.
/// </summary> /// </summary>
......
...@@ -219,6 +219,9 @@ ...@@ -219,6 +219,9 @@
<data name="IDS_FeatureAutoImplementedProperties" xml:space="preserve"> <data name="IDS_FeatureAutoImplementedProperties" xml:space="preserve">
<value>automatically implemented properties</value> <value>automatically implemented properties</value>
</data> </data>
<data name="IDS_FeatureReadonlyAutoImplementedProperties" xml:space="preserve">
<value>readonly automatically implemented properties</value>
</data>
<data name="IDS_FeatureObjectInitializer" xml:space="preserve"> <data name="IDS_FeatureObjectInitializer" xml:space="preserve">
<value>object initializer</value> <value>object initializer</value>
</data> </data>
......
...@@ -111,6 +111,7 @@ internal enum MessageID ...@@ -111,6 +111,7 @@ internal enum MessageID
IDS_FeatureInterpolatedStrings = MessageBase + 12702, IDS_FeatureInterpolatedStrings = MessageBase + 12702,
IDS_OperationCausedStackOverflow = MessageBase + 12703, IDS_OperationCausedStackOverflow = MessageBase + 12703,
IDS_AwaitInCatchAndFinally = MessageBase + 12704, IDS_AwaitInCatchAndFinally = MessageBase + 12704,
IDS_FeatureReadonlyAutoImplementedProperties = MessageBase + 12705,
} }
// Message IDs may refer to strings that need to be localized. // Message IDs may refer to strings that need to be localized.
...@@ -171,6 +172,7 @@ internal static LanguageVersion RequiredVersion(this MessageID feature) ...@@ -171,6 +172,7 @@ internal static LanguageVersion RequiredVersion(this MessageID feature)
case MessageID.IDS_FeatureUsingStatic: case MessageID.IDS_FeatureUsingStatic:
case MessageID.IDS_FeatureInterpolatedStrings: case MessageID.IDS_FeatureInterpolatedStrings:
case MessageID.IDS_AwaitInCatchAndFinally: case MessageID.IDS_AwaitInCatchAndFinally:
case MessageID.IDS_FeatureReadonlyAutoImplementedProperties:
return LanguageVersion.CSharp6; return LanguageVersion.CSharp6;
// C# 5 features. // C# 5 features.
......
...@@ -154,6 +154,7 @@ internal sealed class SourcePropertySymbol : PropertySymbol, IAttributeTargetSym ...@@ -154,6 +154,7 @@ internal sealed class SourcePropertySymbol : PropertySymbol, IAttributeTargetSym
{ {
var hasGetSyntax = getSyntax != null; var hasGetSyntax = getSyntax != null;
_isAutoProperty = notRegularProperty && hasGetSyntax; _isAutoProperty = notRegularProperty && hasGetSyntax;
bool isReadOnly = hasGetSyntax && setSyntax == null;
if (_isAutoProperty || hasInitializer) if (_isAutoProperty || hasInitializer)
{ {
...@@ -165,7 +166,6 @@ internal sealed class SourcePropertySymbol : PropertySymbol, IAttributeTargetSym ...@@ -165,7 +166,6 @@ internal sealed class SourcePropertySymbol : PropertySymbol, IAttributeTargetSym
} }
string fieldName = GeneratedNames.MakeBackingFieldName(_sourceName); string fieldName = GeneratedNames.MakeBackingFieldName(_sourceName);
bool isReadOnly = hasGetSyntax && setSyntax == null;
_backingField = new SynthesizedBackingFieldSymbol(this, _backingField = new SynthesizedBackingFieldSymbol(this,
fieldName, fieldName,
isReadOnly, isReadOnly,
...@@ -175,7 +175,10 @@ internal sealed class SourcePropertySymbol : PropertySymbol, IAttributeTargetSym ...@@ -175,7 +175,10 @@ internal sealed class SourcePropertySymbol : PropertySymbol, IAttributeTargetSym
if (notRegularProperty) if (notRegularProperty)
{ {
Binder.CheckFeatureAvailability(location, MessageID.IDS_FeatureAutoImplementedProperties, diagnostics); Binder.CheckFeatureAvailability(location,
isReadOnly ? MessageID.IDS_FeatureReadonlyAutoImplementedProperties :
MessageID.IDS_FeatureAutoImplementedProperties,
diagnostics);
} }
} }
......
...@@ -2784,5 +2784,39 @@ static void Main(string[] args) ...@@ -2784,5 +2784,39 @@ static void Main(string[] args)
Diagnostic(ErrorCode.ERR_IllegalUnsafe, "Test").WithLocation(2, 14) Diagnostic(ErrorCode.ERR_IllegalUnsafe, "Test").WithLocation(2, 14)
); );
} }
[Fact, WorkItem(4696, "https://github.com/dotnet/roslyn/issues/4696")]
public void LangVersioAndReadonlyAutoProperty()
{
var source = @"
public class Class1
{
public Class1()
{
Prop1 = ""Test"";
}
public string Prop1 { get; }
}
abstract class Class2
{
public abstract string Prop2 { get; }
}
interface I1
{
string Prop3 { get; }
}
";
var comp = CreateCompilationWithMscorlib(source, parseOptions: CSharpParseOptions.Default.WithLanguageVersion(LanguageVersion.CSharp5));
comp.GetDeclarationDiagnostics().Verify(
// (9,19): error CS8026: Feature 'readonly automatically implemented properties' is not available in C# 5. Please use language version 6 or greater.
// public string Prop1 { get; }
Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion5, "Prop1").WithArguments("readonly automatically implemented properties", "6").WithLocation(9, 19)
);
}
} }
} }
...@@ -1838,6 +1838,9 @@ class B : A ...@@ -1838,6 +1838,9 @@ class B : A
// (8,34): error CS0112: A static member 'B.Q' cannot be marked as override, virtual, or abstract // (8,34): error CS0112: A static member 'B.Q' cannot be marked as override, virtual, or abstract
// public static virtual object Q { get; } // public static virtual object Q { get; }
Diagnostic(ErrorCode.ERR_StaticNotVirtual, "Q").WithArguments("B.Q").WithLocation(8, 34), Diagnostic(ErrorCode.ERR_StaticNotVirtual, "Q").WithArguments("B.Q").WithLocation(8, 34),
// (8,34): error CS8026: Feature 'readonly automatically implemented properties' is not available in C# 5. Please use language version 6 or greater.
// public static virtual object Q { get; }
Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion5, "Q").WithArguments("readonly automatically implemented properties", "6").WithLocation(8, 34),
// (9,37): error CS0112: A static member 'B.R' cannot be marked as override, virtual, or abstract // (9,37): error CS0112: A static member 'B.R' cannot be marked as override, virtual, or abstract
// internal static abstract object R { get; set; } // internal static abstract object R { get; set; }
Diagnostic(ErrorCode.ERR_StaticNotVirtual, "R").WithArguments("B.R").WithLocation(9, 37), Diagnostic(ErrorCode.ERR_StaticNotVirtual, "R").WithArguments("B.R").WithLocation(9, 37),
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册