提交 09398766 编写于 作者: A AlekseyTs

Add C# language version check for read-only auto-properties.

Fixes #4696.
上级 5d5d1202
......@@ -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>
/// Looks up a localized string similar to static classes.
/// </summary>
......
......@@ -219,6 +219,9 @@
<data name="IDS_FeatureAutoImplementedProperties" xml:space="preserve">
<value>automatically implemented properties</value>
</data>
<data name="IDS_FeatureReadonlyAutoImplementedProperties" xml:space="preserve">
<value>readonly automatically implemented properties</value>
</data>
<data name="IDS_FeatureObjectInitializer" xml:space="preserve">
<value>object initializer</value>
</data>
......
......@@ -111,6 +111,7 @@ internal enum MessageID
IDS_FeatureInterpolatedStrings = MessageBase + 12702,
IDS_OperationCausedStackOverflow = MessageBase + 12703,
IDS_AwaitInCatchAndFinally = MessageBase + 12704,
IDS_FeatureReadonlyAutoImplementedProperties = MessageBase + 12705,
}
// Message IDs may refer to strings that need to be localized.
......@@ -171,6 +172,7 @@ internal static LanguageVersion RequiredVersion(this MessageID feature)
case MessageID.IDS_FeatureUsingStatic:
case MessageID.IDS_FeatureInterpolatedStrings:
case MessageID.IDS_AwaitInCatchAndFinally:
case MessageID.IDS_FeatureReadonlyAutoImplementedProperties:
return LanguageVersion.CSharp6;
// C# 5 features.
......
......@@ -154,6 +154,7 @@ internal sealed class SourcePropertySymbol : PropertySymbol, IAttributeTargetSym
{
var hasGetSyntax = getSyntax != null;
_isAutoProperty = notRegularProperty && hasGetSyntax;
bool isReadOnly = hasGetSyntax && setSyntax == null;
if (_isAutoProperty || hasInitializer)
{
......@@ -165,7 +166,6 @@ internal sealed class SourcePropertySymbol : PropertySymbol, IAttributeTargetSym
}
string fieldName = GeneratedNames.MakeBackingFieldName(_sourceName);
bool isReadOnly = hasGetSyntax && setSyntax == null;
_backingField = new SynthesizedBackingFieldSymbol(this,
fieldName,
isReadOnly,
......@@ -175,7 +175,10 @@ internal sealed class SourcePropertySymbol : PropertySymbol, IAttributeTargetSym
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)
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
// (8,34): error CS0112: A static member 'B.Q' cannot be marked as override, virtual, or abstract
// public static virtual object Q { get; }
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
// internal static abstract object R { get; set; }
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.
先完成此消息的编辑!
想要评论请 注册