未验证 提交 12f1b8f6 编写于 作者: C Chris Sienkiewicz 提交者: GitHub

LangVersion 9 (#44911)

* Introduce LanguageVersion.CSharp9
* Limit netcoreapp3.0, 3.1 and netstdard 2.1 to C# 8.0
* Map CSharp9 to language version preview
* Default to CSharp9 for netcoreapp5.0
* Add Tests
上级 915da6a5
...@@ -6250,6 +6250,9 @@ To remove the warning, you can use /reference instead (set the Embed Interop Typ ...@@ -6250,6 +6250,9 @@ To remove the warning, you can use /reference instead (set the Embed Interop Typ
<data name="ERR_AddressOfToNonFunctionPointer" xml:space="preserve"> <data name="ERR_AddressOfToNonFunctionPointer" xml:space="preserve">
<value>Cannot convert &amp;method group '{0}' to non-function pointer type '{1}'.</value> <value>Cannot convert &amp;method group '{0}' to non-function pointer type '{1}'.</value>
</data> </data>
<data name="ERR_FeatureNotAvailableInVersion9" xml:space="preserve">
<value>Feature '{0}' is not available in C# 9.0. Please use language version {1} or greater.</value>
</data>
<data name="ERR_UnexpectedArgumentList" xml:space="preserve"> <data name="ERR_UnexpectedArgumentList" xml:space="preserve">
<value>Unexpected argument list.</value> <value>Unexpected argument list.</value>
</data> </data>
......
...@@ -1740,7 +1740,7 @@ internal enum ErrorCode ...@@ -1740,7 +1740,7 @@ internal enum ErrorCode
#endregion diagnostics introduced for C# 8.0 #endregion diagnostics introduced for C# 8.0
#region diagnostics introduced in preview #region diagnostics introduced in C# 9.0
ERR_InternalError = 8751, ERR_InternalError = 8751,
...@@ -1818,6 +1818,7 @@ internal enum ErrorCode ...@@ -1818,6 +1818,7 @@ internal enum ErrorCode
ERR_AddressOfMethodGroupInExpressionTree = 8810, ERR_AddressOfMethodGroupInExpressionTree = 8810,
ERR_CannotConvertAddressOfToDelegate = 8811, ERR_CannotConvertAddressOfToDelegate = 8811,
ERR_AddressOfToNonFunctionPointer = 8812, ERR_AddressOfToNonFunctionPointer = 8812,
ERR_FeatureNotAvailableInVersion9 = 8813,
// Codes 8813, 8814, 8815, 8816 used by features/module-initializers // Codes 8813, 8814, 8815, 8816 used by features/module-initializers
...@@ -1846,8 +1847,7 @@ internal enum ErrorCode ...@@ -1846,8 +1847,7 @@ internal enum ErrorCode
ERR_NoCopyConstructorInBaseType = 8867, ERR_NoCopyConstructorInBaseType = 8867,
ERR_CopyConstructorMustInvokeBaseCopyConstructor = 8868, ERR_CopyConstructorMustInvokeBaseCopyConstructor = 8868,
#endregion #endregion diagnostics introduced for C# 9.0
// Note: you will need to re-generate compiler code after adding warnings (eng\generate-compiler-code.cmd) // Note: you will need to re-generate compiler code after adding warnings (eng\generate-compiler-code.cmd)
} }
} }
...@@ -128,13 +128,13 @@ public enum LanguageVersion ...@@ -128,13 +128,13 @@ public enum LanguageVersion
/// </summary> /// </summary>
CSharp8 = 800, CSharp8 = 800,
// When this value is released, update LanguageVersionExtensions in the IDE layer to point to it. // When this value is available in the released NuGet packge, update LanguageVersionExtensions in the IDE layer to point to it.
// https://github.com/dotnet/roslyn/issues/43348 // https://github.com/dotnet/roslyn/issues/43348
// //
// /// <summary> /// <summary>
// /// C# language version 9.0 /// C# language version 9.0
// /// </summary> /// </summary>
// CSharp9 = 900, CSharp9 = 900,
/// <summary> /// <summary>
/// The latest major supported version. /// The latest major supported version.
...@@ -174,6 +174,7 @@ internal static bool IsValid(this LanguageVersion value) ...@@ -174,6 +174,7 @@ internal static bool IsValid(this LanguageVersion value)
case LanguageVersion.CSharp7_2: case LanguageVersion.CSharp7_2:
case LanguageVersion.CSharp7_3: case LanguageVersion.CSharp7_3:
case LanguageVersion.CSharp8: case LanguageVersion.CSharp8:
case LanguageVersion.CSharp9:
case LanguageVersion.Preview: case LanguageVersion.Preview:
return true; return true;
} }
...@@ -207,6 +208,8 @@ internal static ErrorCode GetErrorCode(this LanguageVersion version) ...@@ -207,6 +208,8 @@ internal static ErrorCode GetErrorCode(this LanguageVersion version)
return ErrorCode.ERR_FeatureNotAvailableInVersion7_3; return ErrorCode.ERR_FeatureNotAvailableInVersion7_3;
case LanguageVersion.CSharp8: case LanguageVersion.CSharp8:
return ErrorCode.ERR_FeatureNotAvailableInVersion8; return ErrorCode.ERR_FeatureNotAvailableInVersion8;
case LanguageVersion.CSharp9:
return ErrorCode.ERR_FeatureNotAvailableInVersion9;
default: default:
throw ExceptionUtilities.UnexpectedValue(version); throw ExceptionUtilities.UnexpectedValue(version);
} }
...@@ -257,6 +260,8 @@ public static string ToDisplayString(this LanguageVersion version) ...@@ -257,6 +260,8 @@ public static string ToDisplayString(this LanguageVersion version)
return "7.3"; return "7.3";
case LanguageVersion.CSharp8: case LanguageVersion.CSharp8:
return "8.0"; return "8.0";
case LanguageVersion.CSharp9:
return "9.0";
case LanguageVersion.Default: case LanguageVersion.Default:
return "default"; return "default";
case LanguageVersion.Latest: case LanguageVersion.Latest:
...@@ -353,6 +358,11 @@ public static bool TryParse(string? version, out LanguageVersion result) ...@@ -353,6 +358,11 @@ public static bool TryParse(string? version, out LanguageVersion result)
result = LanguageVersion.CSharp8; result = LanguageVersion.CSharp8;
return true; return true;
case "9":
case "9.0":
result = LanguageVersion.CSharp9;
return true;
default: default:
result = LanguageVersion.Default; result = LanguageVersion.Default;
return false; return false;
...@@ -370,12 +380,14 @@ public static LanguageVersion MapSpecifiedToEffectiveVersion(this LanguageVersio ...@@ -370,12 +380,14 @@ public static LanguageVersion MapSpecifiedToEffectiveVersion(this LanguageVersio
case LanguageVersion.Default: case LanguageVersion.Default:
case LanguageVersion.LatestMajor: case LanguageVersion.LatestMajor:
return LanguageVersion.CSharp8; return LanguageVersion.CSharp8;
case LanguageVersion.CSharp9:
return LanguageVersion.Preview;
default: default:
return version; return version;
} }
} }
internal static LanguageVersion CurrentVersion => LanguageVersion.CSharp8; internal static LanguageVersion CurrentVersion => LanguageVersion.CSharp9;
/// <summary>Inference of tuple element names was added in C# 7.1</summary> /// <summary>Inference of tuple element names was added in C# 7.1</summary>
internal static bool DisallowInferredTupleElementNames(this LanguageVersion self) internal static bool DisallowInferredTupleElementNames(this LanguageVersion self)
......
...@@ -64,6 +64,7 @@ ...@@ -64,6 +64,7 @@
<InternalsVisibleTo Include="Microsoft.CodeAnalysis.CSharp.EditorFeatures.UnitTests" /> <InternalsVisibleTo Include="Microsoft.CodeAnalysis.CSharp.EditorFeatures.UnitTests" />
<InternalsVisibleTo Include="Microsoft.CodeAnalysis.EditorFeatures2.UnitTests" /> <InternalsVisibleTo Include="Microsoft.CodeAnalysis.EditorFeatures2.UnitTests" />
<InternalsVisibleTo Include="CompilerBenchmarks" /> <InternalsVisibleTo Include="CompilerBenchmarks" />
<InternalsVisibleTo Include="Microsoft.Build.Tasks.CodeAnalysis.UnitTests" />
</ItemGroup> </ItemGroup>
<Import Project="..\CSharpAnalyzerDriver\CSharpAnalyzerDriver.projitems" Label="Shared" /> <Import Project="..\CSharpAnalyzerDriver\CSharpAnalyzerDriver.projitems" Label="Shared" />
</Project> </Project>
...@@ -36,6 +36,7 @@ abstract Microsoft.CodeAnalysis.CSharp.Syntax.BaseObjectCreationExpressionSyntax ...@@ -36,6 +36,7 @@ abstract Microsoft.CodeAnalysis.CSharp.Syntax.BaseObjectCreationExpressionSyntax
abstract Microsoft.CodeAnalysis.CSharp.Syntax.BaseObjectCreationExpressionSyntax.Initializer.get -> Microsoft.CodeAnalysis.CSharp.Syntax.InitializerExpressionSyntax abstract Microsoft.CodeAnalysis.CSharp.Syntax.BaseObjectCreationExpressionSyntax.Initializer.get -> Microsoft.CodeAnalysis.CSharp.Syntax.InitializerExpressionSyntax
abstract Microsoft.CodeAnalysis.CSharp.Syntax.BaseObjectCreationExpressionSyntax.NewKeyword.get -> Microsoft.CodeAnalysis.SyntaxToken abstract Microsoft.CodeAnalysis.CSharp.Syntax.BaseObjectCreationExpressionSyntax.NewKeyword.get -> Microsoft.CodeAnalysis.SyntaxToken
Microsoft.CodeAnalysis.CSharp.CSharpGeneratorDriver Microsoft.CodeAnalysis.CSharp.CSharpGeneratorDriver
Microsoft.CodeAnalysis.CSharp.LanguageVersion.CSharp9 = 900 -> Microsoft.CodeAnalysis.CSharp.LanguageVersion
Microsoft.CodeAnalysis.CSharp.CSharpGeneratorDriver.CSharpGeneratorDriver(Microsoft.CodeAnalysis.ParseOptions parseOptions, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.ISourceGenerator> generators, Microsoft.CodeAnalysis.Diagnostics.AnalyzerConfigOptionsProvider optionsProvider, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.AdditionalText> additionalTexts) -> void Microsoft.CodeAnalysis.CSharp.CSharpGeneratorDriver.CSharpGeneratorDriver(Microsoft.CodeAnalysis.ParseOptions parseOptions, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.ISourceGenerator> generators, Microsoft.CodeAnalysis.Diagnostics.AnalyzerConfigOptionsProvider optionsProvider, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.AdditionalText> additionalTexts) -> void
Microsoft.CodeAnalysis.CSharp.Syntax.FunctionPointerTypeSyntax Microsoft.CodeAnalysis.CSharp.Syntax.FunctionPointerTypeSyntax
Microsoft.CodeAnalysis.CSharp.Syntax.FunctionPointerTypeSyntax.AddParameters(params Microsoft.CodeAnalysis.CSharp.Syntax.ParameterSyntax[] items) -> Microsoft.CodeAnalysis.CSharp.Syntax.FunctionPointerTypeSyntax Microsoft.CodeAnalysis.CSharp.Syntax.FunctionPointerTypeSyntax.AddParameters(params Microsoft.CodeAnalysis.CSharp.Syntax.ParameterSyntax[] items) -> Microsoft.CodeAnalysis.CSharp.Syntax.FunctionPointerTypeSyntax
......
...@@ -342,6 +342,11 @@ ...@@ -342,6 +342,11 @@
<target state="translated">Funkce {0} není v C# 8.0 dostupná. Použijte prosím jazykovou verzi {1} nebo větší.</target> <target state="translated">Funkce {0} není v C# 8.0 dostupná. Použijte prosím jazykovou verzi {1} nebo větší.</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="ERR_FeatureNotAvailableInVersion9">
<source>Feature '{0}' is not available in C# 9.0. Please use language version {1} or greater.</source>
<target state="new">Feature '{0}' is not available in C# 9.0. Please use language version {1} or greater.</target>
<note />
</trans-unit>
<trans-unit id="ERR_FieldLikeEventCantBeReadOnly"> <trans-unit id="ERR_FieldLikeEventCantBeReadOnly">
<source>Field-like event '{0}' cannot be 'readonly'.</source> <source>Field-like event '{0}' cannot be 'readonly'.</source>
<target state="translated">Událost podobná poli {0} nemůže mít modifikátor readonly.</target> <target state="translated">Událost podobná poli {0} nemůže mít modifikátor readonly.</target>
......
...@@ -342,6 +342,11 @@ ...@@ -342,6 +342,11 @@
<target state="translated">Das Feature "{0}" ist in C# 8.0 nicht verfügbar. Verwenden Sie Sprachversion {1} oder höher.</target> <target state="translated">Das Feature "{0}" ist in C# 8.0 nicht verfügbar. Verwenden Sie Sprachversion {1} oder höher.</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="ERR_FeatureNotAvailableInVersion9">
<source>Feature '{0}' is not available in C# 9.0. Please use language version {1} or greater.</source>
<target state="new">Feature '{0}' is not available in C# 9.0. Please use language version {1} or greater.</target>
<note />
</trans-unit>
<trans-unit id="ERR_FieldLikeEventCantBeReadOnly"> <trans-unit id="ERR_FieldLikeEventCantBeReadOnly">
<source>Field-like event '{0}' cannot be 'readonly'.</source> <source>Field-like event '{0}' cannot be 'readonly'.</source>
<target state="translated">Ein feldähnliches Ereignis "{0}" darf nicht "readonly" sein.</target> <target state="translated">Ein feldähnliches Ereignis "{0}" darf nicht "readonly" sein.</target>
......
...@@ -342,6 +342,11 @@ ...@@ -342,6 +342,11 @@
<target state="translated">La característica "{0}" no está disponible en C# 8.0. Use la versión {1} del lenguaje o una posterior.</target> <target state="translated">La característica "{0}" no está disponible en C# 8.0. Use la versión {1} del lenguaje o una posterior.</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="ERR_FeatureNotAvailableInVersion9">
<source>Feature '{0}' is not available in C# 9.0. Please use language version {1} or greater.</source>
<target state="new">Feature '{0}' is not available in C# 9.0. Please use language version {1} or greater.</target>
<note />
</trans-unit>
<trans-unit id="ERR_FieldLikeEventCantBeReadOnly"> <trans-unit id="ERR_FieldLikeEventCantBeReadOnly">
<source>Field-like event '{0}' cannot be 'readonly'.</source> <source>Field-like event '{0}' cannot be 'readonly'.</source>
<target state="translated">El evento de tipo campo "{0}" no puede ser "readonly".</target> <target state="translated">El evento de tipo campo "{0}" no puede ser "readonly".</target>
......
...@@ -342,6 +342,11 @@ ...@@ -342,6 +342,11 @@
<target state="translated">La fonctionnalité '{0}' n'est pas disponible en C# 8.0. Utilisez la version de langage {1} ou une version ultérieure.</target> <target state="translated">La fonctionnalité '{0}' n'est pas disponible en C# 8.0. Utilisez la version de langage {1} ou une version ultérieure.</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="ERR_FeatureNotAvailableInVersion9">
<source>Feature '{0}' is not available in C# 9.0. Please use language version {1} or greater.</source>
<target state="new">Feature '{0}' is not available in C# 9.0. Please use language version {1} or greater.</target>
<note />
</trans-unit>
<trans-unit id="ERR_FieldLikeEventCantBeReadOnly"> <trans-unit id="ERR_FieldLikeEventCantBeReadOnly">
<source>Field-like event '{0}' cannot be 'readonly'.</source> <source>Field-like event '{0}' cannot be 'readonly'.</source>
<target state="translated">L'événement de type champ '{0}' ne peut pas être 'readonly'.</target> <target state="translated">L'événement de type champ '{0}' ne peut pas être 'readonly'.</target>
......
...@@ -342,6 +342,11 @@ ...@@ -342,6 +342,11 @@
<target state="translated">La funzionalità '{0}' non è disponibile in C# 8.0. Usare la versione {1} o versioni successive del linguaggio.</target> <target state="translated">La funzionalità '{0}' non è disponibile in C# 8.0. Usare la versione {1} o versioni successive del linguaggio.</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="ERR_FeatureNotAvailableInVersion9">
<source>Feature '{0}' is not available in C# 9.0. Please use language version {1} or greater.</source>
<target state="new">Feature '{0}' is not available in C# 9.0. Please use language version {1} or greater.</target>
<note />
</trans-unit>
<trans-unit id="ERR_FieldLikeEventCantBeReadOnly"> <trans-unit id="ERR_FieldLikeEventCantBeReadOnly">
<source>Field-like event '{0}' cannot be 'readonly'.</source> <source>Field-like event '{0}' cannot be 'readonly'.</source>
<target state="translated">L'evento simile a campo '{0}' non può essere 'readonly'.</target> <target state="translated">L'evento simile a campo '{0}' non può essere 'readonly'.</target>
......
...@@ -342,6 +342,11 @@ ...@@ -342,6 +342,11 @@
<target state="translated">機能 '{0}' は C# 8.0 では使用できません。言語バージョン {1} 以上を使用してください。</target> <target state="translated">機能 '{0}' は C# 8.0 では使用できません。言語バージョン {1} 以上を使用してください。</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="ERR_FeatureNotAvailableInVersion9">
<source>Feature '{0}' is not available in C# 9.0. Please use language version {1} or greater.</source>
<target state="new">Feature '{0}' is not available in C# 9.0. Please use language version {1} or greater.</target>
<note />
</trans-unit>
<trans-unit id="ERR_FieldLikeEventCantBeReadOnly"> <trans-unit id="ERR_FieldLikeEventCantBeReadOnly">
<source>Field-like event '{0}' cannot be 'readonly'.</source> <source>Field-like event '{0}' cannot be 'readonly'.</source>
<target state="translated">フィールドに類似したイベント '{0}' を 'readonly' にすることはできません。</target> <target state="translated">フィールドに類似したイベント '{0}' を 'readonly' にすることはできません。</target>
......
...@@ -342,6 +342,11 @@ ...@@ -342,6 +342,11 @@
<target state="translated">'{0}' 기능은 C# 8.0에서 사용할 수 없습니다. 언어 버전 {1} 이상을 사용하세요.</target> <target state="translated">'{0}' 기능은 C# 8.0에서 사용할 수 없습니다. 언어 버전 {1} 이상을 사용하세요.</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="ERR_FeatureNotAvailableInVersion9">
<source>Feature '{0}' is not available in C# 9.0. Please use language version {1} or greater.</source>
<target state="new">Feature '{0}' is not available in C# 9.0. Please use language version {1} or greater.</target>
<note />
</trans-unit>
<trans-unit id="ERR_FieldLikeEventCantBeReadOnly"> <trans-unit id="ERR_FieldLikeEventCantBeReadOnly">
<source>Field-like event '{0}' cannot be 'readonly'.</source> <source>Field-like event '{0}' cannot be 'readonly'.</source>
<target state="translated">필드와 유사한 이벤트 '{0}'이(가) 'readonly'일 수 없습니다.</target> <target state="translated">필드와 유사한 이벤트 '{0}'이(가) 'readonly'일 수 없습니다.</target>
......
...@@ -342,6 +342,11 @@ ...@@ -342,6 +342,11 @@
<target state="translated">Funkcja „{0}” nie jest dostępna w języku C# 8.0. Użyj języka w wersji {1} lub nowszej.</target> <target state="translated">Funkcja „{0}” nie jest dostępna w języku C# 8.0. Użyj języka w wersji {1} lub nowszej.</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="ERR_FeatureNotAvailableInVersion9">
<source>Feature '{0}' is not available in C# 9.0. Please use language version {1} or greater.</source>
<target state="new">Feature '{0}' is not available in C# 9.0. Please use language version {1} or greater.</target>
<note />
</trans-unit>
<trans-unit id="ERR_FieldLikeEventCantBeReadOnly"> <trans-unit id="ERR_FieldLikeEventCantBeReadOnly">
<source>Field-like event '{0}' cannot be 'readonly'.</source> <source>Field-like event '{0}' cannot be 'readonly'.</source>
<target state="translated">Zdarzenie-pole „{0}” nie może być zadeklarowane jako „readonly”.</target> <target state="translated">Zdarzenie-pole „{0}” nie może być zadeklarowane jako „readonly”.</target>
......
...@@ -342,6 +342,11 @@ ...@@ -342,6 +342,11 @@
<target state="translated">O recurso '{0}' não está disponível em C# 8.0. Use a versão de linguagem {1} ou superior.</target> <target state="translated">O recurso '{0}' não está disponível em C# 8.0. Use a versão de linguagem {1} ou superior.</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="ERR_FeatureNotAvailableInVersion9">
<source>Feature '{0}' is not available in C# 9.0. Please use language version {1} or greater.</source>
<target state="new">Feature '{0}' is not available in C# 9.0. Please use language version {1} or greater.</target>
<note />
</trans-unit>
<trans-unit id="ERR_FieldLikeEventCantBeReadOnly"> <trans-unit id="ERR_FieldLikeEventCantBeReadOnly">
<source>Field-like event '{0}' cannot be 'readonly'.</source> <source>Field-like event '{0}' cannot be 'readonly'.</source>
<target state="translated">O evento '{0}' semelhante ao de campo não pode ser 'readonly'.</target> <target state="translated">O evento '{0}' semelhante ao de campo não pode ser 'readonly'.</target>
......
...@@ -342,6 +342,11 @@ ...@@ -342,6 +342,11 @@
<target state="translated">Функция "{0}" недоступна в C# 8.0. Используйте версию языка {1} или более позднюю.</target> <target state="translated">Функция "{0}" недоступна в C# 8.0. Используйте версию языка {1} или более позднюю.</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="ERR_FeatureNotAvailableInVersion9">
<source>Feature '{0}' is not available in C# 9.0. Please use language version {1} or greater.</source>
<target state="new">Feature '{0}' is not available in C# 9.0. Please use language version {1} or greater.</target>
<note />
</trans-unit>
<trans-unit id="ERR_FieldLikeEventCantBeReadOnly"> <trans-unit id="ERR_FieldLikeEventCantBeReadOnly">
<source>Field-like event '{0}' cannot be 'readonly'.</source> <source>Field-like event '{0}' cannot be 'readonly'.</source>
<target state="translated">Подобное полю событие "{0}" не может быть readonly.</target> <target state="translated">Подобное полю событие "{0}" не может быть readonly.</target>
......
...@@ -342,6 +342,11 @@ ...@@ -342,6 +342,11 @@
<target state="translated">'{0}' özelliği C# 8.0'da kullanılamaz. Lütfen {1} veya daha yüksek bir dil sürümü kullanın.</target> <target state="translated">'{0}' özelliği C# 8.0'da kullanılamaz. Lütfen {1} veya daha yüksek bir dil sürümü kullanın.</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="ERR_FeatureNotAvailableInVersion9">
<source>Feature '{0}' is not available in C# 9.0. Please use language version {1} or greater.</source>
<target state="new">Feature '{0}' is not available in C# 9.0. Please use language version {1} or greater.</target>
<note />
</trans-unit>
<trans-unit id="ERR_FieldLikeEventCantBeReadOnly"> <trans-unit id="ERR_FieldLikeEventCantBeReadOnly">
<source>Field-like event '{0}' cannot be 'readonly'.</source> <source>Field-like event '{0}' cannot be 'readonly'.</source>
<target state="translated">Alan benzeri '{0}' olayı 'readonly' olamaz.</target> <target state="translated">Alan benzeri '{0}' olayı 'readonly' olamaz.</target>
......
...@@ -342,6 +342,11 @@ ...@@ -342,6 +342,11 @@
<target state="translated">功能“{0}”在 C# 8.0 中不可用。请使用语言版本 {1} 或更高版本。</target> <target state="translated">功能“{0}”在 C# 8.0 中不可用。请使用语言版本 {1} 或更高版本。</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="ERR_FeatureNotAvailableInVersion9">
<source>Feature '{0}' is not available in C# 9.0. Please use language version {1} or greater.</source>
<target state="new">Feature '{0}' is not available in C# 9.0. Please use language version {1} or greater.</target>
<note />
</trans-unit>
<trans-unit id="ERR_FieldLikeEventCantBeReadOnly"> <trans-unit id="ERR_FieldLikeEventCantBeReadOnly">
<source>Field-like event '{0}' cannot be 'readonly'.</source> <source>Field-like event '{0}' cannot be 'readonly'.</source>
<target state="translated">类似字段的事件 "{0}" 不能为 "readonly"。</target> <target state="translated">类似字段的事件 "{0}" 不能为 "readonly"。</target>
......
...@@ -342,6 +342,11 @@ ...@@ -342,6 +342,11 @@
<target state="translated">C# 8.0 中無法使用功能 '{0}'。請使用 {1} 或更新的語言版本。</target> <target state="translated">C# 8.0 中無法使用功能 '{0}'。請使用 {1} 或更新的語言版本。</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="ERR_FeatureNotAvailableInVersion9">
<source>Feature '{0}' is not available in C# 9.0. Please use language version {1} or greater.</source>
<target state="new">Feature '{0}' is not available in C# 9.0. Please use language version {1} or greater.</target>
<note />
</trans-unit>
<trans-unit id="ERR_FieldLikeEventCantBeReadOnly"> <trans-unit id="ERR_FieldLikeEventCantBeReadOnly">
<source>Field-like event '{0}' cannot be 'readonly'.</source> <source>Field-like event '{0}' cannot be 'readonly'.</source>
<target state="translated">類似欄位的事件 '{0}' 不能是 'readonly'。</target> <target state="translated">類似欄位的事件 '{0}' 不能是 'readonly'。</target>
......
...@@ -1599,7 +1599,7 @@ public void LangVersion_NoValueSpecified() ...@@ -1599,7 +1599,7 @@ public void LangVersion_NoValueSpecified()
[InlineData("iso-3")] [InlineData("iso-3")]
[InlineData("iso1")] [InlineData("iso1")]
[InlineData("8.1")] [InlineData("8.1")]
[InlineData("9")] [InlineData("10")]
[InlineData("1000")] [InlineData("1000")]
public void LangVersion_BadVersion(string value) public void LangVersion_BadVersion(string value)
{ {
...@@ -1614,6 +1614,8 @@ public void LangVersion_BadVersion(string value) ...@@ -1614,6 +1614,8 @@ public void LangVersion_BadVersion(string value)
[InlineData("05")] [InlineData("05")]
[InlineData("07")] [InlineData("07")]
[InlineData("07.1")] [InlineData("07.1")]
[InlineData("08")]
[InlineData("09")]
public void LangVersion_LeadingZeroes(string value) public void LangVersion_LeadingZeroes(string value)
{ {
DefaultParse(new[] { $"/langversion:{value}", "a.cs" }, WorkingDirectory).Errors.Verify( DefaultParse(new[] { $"/langversion:{value}", "a.cs" }, WorkingDirectory).Errors.Verify(
...@@ -1652,7 +1654,7 @@ public void LanguageVersionAdded_Canary() ...@@ -1652,7 +1654,7 @@ public void LanguageVersionAdded_Canary()
// - update the "UpgradeProject" codefixer // - update the "UpgradeProject" codefixer
// - update the IDE drop-down for selecting Language Version (in project-systems repo) // - update the IDE drop-down for selecting Language Version (in project-systems repo)
// - update all the tests that call this canary // - update all the tests that call this canary
AssertEx.SetEqual(new[] { "default", "1", "2", "3", "4", "5", "6", "7.0", "7.1", "7.2", "7.3", "8.0", "latest", "latestmajor", "preview" }, AssertEx.SetEqual(new[] { "default", "1", "2", "3", "4", "5", "6", "7.0", "7.1", "7.2", "7.3", "8.0", "9.0", "latest", "latestmajor", "preview" },
Enum.GetValues(typeof(LanguageVersion)).Cast<LanguageVersion>().Select(v => v.ToDisplayString())); Enum.GetValues(typeof(LanguageVersion)).Cast<LanguageVersion>().Select(v => v.ToDisplayString()));
// For minor versions and new major versions, the format should be "x.y", such as "7.1" // For minor versions and new major versions, the format should be "x.y", such as "7.1"
} }
...@@ -1683,6 +1685,7 @@ public void LanguageVersion_GetErrorCode() ...@@ -1683,6 +1685,7 @@ public void LanguageVersion_GetErrorCode()
ErrorCode.ERR_FeatureNotAvailableInVersion7_2, ErrorCode.ERR_FeatureNotAvailableInVersion7_2,
ErrorCode.ERR_FeatureNotAvailableInVersion7_3, ErrorCode.ERR_FeatureNotAvailableInVersion7_3,
ErrorCode.ERR_FeatureNotAvailableInVersion8, ErrorCode.ERR_FeatureNotAvailableInVersion8,
ErrorCode.ERR_FeatureNotAvailableInVersion9,
}; };
AssertEx.SetEqual(versions, errorCodes); AssertEx.SetEqual(versions, errorCodes);
...@@ -1706,7 +1709,7 @@ public void LanguageVersion_GetErrorCode() ...@@ -1706,7 +1709,7 @@ public void LanguageVersion_GetErrorCode()
InlineData(LanguageVersion.CSharp8, LanguageVersion.LatestMajor), InlineData(LanguageVersion.CSharp8, LanguageVersion.LatestMajor),
InlineData(LanguageVersion.CSharp8, LanguageVersion.Latest), InlineData(LanguageVersion.CSharp8, LanguageVersion.Latest),
InlineData(LanguageVersion.CSharp8, LanguageVersion.Default), InlineData(LanguageVersion.CSharp8, LanguageVersion.Default),
InlineData(LanguageVersion.Preview, LanguageVersion.Preview), InlineData(LanguageVersion.Preview, LanguageVersion.CSharp9),
] ]
public void LanguageVersion_MapSpecifiedToEffectiveVersion(LanguageVersion expectedMappedVersion, LanguageVersion input) public void LanguageVersion_MapSpecifiedToEffectiveVersion(LanguageVersion expectedMappedVersion, LanguageVersion input)
{ {
...@@ -1742,6 +1745,8 @@ public void LanguageVersion_MapSpecifiedToEffectiveVersion(LanguageVersion expec ...@@ -1742,6 +1745,8 @@ public void LanguageVersion_MapSpecifiedToEffectiveVersion(LanguageVersion expec
InlineData("7.3", true, LanguageVersion.CSharp7_3), InlineData("7.3", true, LanguageVersion.CSharp7_3),
InlineData("8", true, LanguageVersion.CSharp8), InlineData("8", true, LanguageVersion.CSharp8),
InlineData("8.0", true, LanguageVersion.CSharp8), InlineData("8.0", true, LanguageVersion.CSharp8),
InlineData("9", true, LanguageVersion.CSharp9),
InlineData("9.0", true, LanguageVersion.CSharp9),
InlineData("08", false, LanguageVersion.Default), InlineData("08", false, LanguageVersion.Default),
InlineData("07.1", false, LanguageVersion.Default), InlineData("07.1", false, LanguageVersion.Default),
InlineData("default", true, LanguageVersion.Default), InlineData("default", true, LanguageVersion.Default),
......
...@@ -3,10 +3,21 @@ ...@@ -3,10 +3,21 @@
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="Microsoft.Managed.Core.targets"/> <Import Project="Microsoft.Managed.Core.targets"/>
<PropertyGroup Condition="('$(TargetFrameworkIdentifier)' != '.NETCoreApp' OR '$(_TargetFrameworkVersionWithoutV)' &lt; '3.0') AND <PropertyGroup>
('$(TargetFrameworkIdentifier)' != '.NETStandard' OR '$(_TargetFrameworkVersionWithoutV)' &lt; '2.1')"> <!-- .NETCoreApp < 3.0, .NETStandard < 2.1, or any other target framework -->
<MaxSupportedLangVersion Condition="'$(MaxSupportedLangVersion)' == ''">7.3</MaxSupportedLangVersion> <_MaxSupportedLangVersion Condition="('$(TargetFrameworkIdentifier)' != '.NETCoreApp' OR '$(_TargetFrameworkVersionWithoutV)' &lt; '3.0') AND
<LangVersion Condition="'$(LangVersion)' == ''">$(MaxSupportedLangVersion)</LangVersion> ('$(TargetFrameworkIdentifier)' != '.NETStandard' OR '$(_TargetFrameworkVersionWithoutV)' &lt; '2.1')">7.3</_MaxSupportedLangVersion>
<!-- .NETCoreApp < 5.0, .NETStandard == 2.1 -->
<_MaxSupportedLangVersion Condition="(('$(TargetFrameworkIdentifier)' == '.NETCoreApp' AND '$(_TargetFrameworkVersionWithoutV)' &lt; '5.0') OR
('$(TargetFrameworkIdentifier)' == '.NETStandard' AND '$(_TargetFrameworkVersionWithoutV)' == '2.1')) AND
'$(_MaxSupportedLangVersion)' == ''">8.0</_MaxSupportedLangVersion>
<!-- .NETCoreApp == 5.0 -->
<_MaxSupportedLangVersion Condition="'$(TargetFrameworkIdentifier)' == '.NETCoreApp' AND '$(_TargetFrameworkVersionWithoutV)' == '5.0' AND
'$(_MaxSupportedLangVersion)' == ''">9.0</_MaxSupportedLangVersion>
<LangVersion Condition="'$(LangVersion)' == '' AND '$(_MaxSupportedLangVersion)' != ''">$(_MaxSupportedLangVersion)</LangVersion>
</PropertyGroup> </PropertyGroup>
<Target Name="CoreCompile" <Target Name="CoreCompile"
......
...@@ -390,6 +390,76 @@ public void GenerateEditorConfigCoreHandlesMalformedCompilerVisibleItemMetadata( ...@@ -390,6 +390,76 @@ public void GenerateEditorConfigCoreHandlesMalformedCompilerVisibleItemMetadata(
Assert.Equal("", metaName.EvaluatedValue); Assert.Equal("", metaName.EvaluatedValue);
} }
[Theory]
[InlineData(".NETFramework", "4.5", "7.3")]
[InlineData(".NETFramework", "4.7.2", "7.3")]
[InlineData(".NETFramework", "4.8", "7.3")]
[InlineData(".NETCoreApp", "1.0", "7.3")]
[InlineData(".NETCoreApp", "2.0", "7.3")]
[InlineData(".NETCoreApp", "2.1", "7.3")]
[InlineData(".NETCoreApp", "3.0", "8.0")]
[InlineData(".NETCoreApp", "3.1", "8.0")]
[InlineData(".NETCoreApp", "5.0", "9.0")]
[InlineData(".NETCoreApp", "6.0", "")]
[InlineData(".NETStandard", "1.0", "7.3")]
[InlineData(".NETStandard", "1.5", "7.3")]
[InlineData(".NETStandard", "2.0", "7.3")]
[InlineData(".NETStandard", "2.1", "8.0")]
[InlineData("UnknownTFM", "0.0", "7.3")]
[InlineData("UnknownTFM", "5.0", "7.3")]
public void LanguageVersionGivenTargetFramework(string tfi, string tfv, string expectedVersion)
{
XmlReader xmlReader = XmlReader.Create(new StringReader($@"
<Project>
<PropertyGroup>
<TargetFrameworkIdentifier>{tfi}</TargetFrameworkIdentifier>
<_TargetFrameworkVersionWithoutV>{tfv}</_TargetFrameworkVersionWithoutV>
</PropertyGroup>
<Import Project=""Microsoft.CSharp.Core.targets"" />
</Project>
"));
var instance = CreateProjectInstance(xmlReader);
instance.Build(GetTestLoggers());
var langVersion = instance.GetPropertyValue("LangVersion");
var maxLangVersion = instance.GetPropertyValue("_MaxSupportedLangVersion");
Assert.Equal(expectedVersion, langVersion);
Assert.Equal(expectedVersion, maxLangVersion);
// This will fail whenever the current language version is updated.
// Ensure you update the target files to select the correct CSharp version for the newest target framework
// and add to the theory data above to cover it, before changing this version to make the test pass again.
Assert.Equal(CSharp.LanguageVersion.CSharp9, CSharp.LanguageVersionFacts.CurrentVersion);
}
[Fact]
public void ExplicitLangVersion()
{
XmlReader xmlReader = XmlReader.Create(new StringReader($@"
<Project>
<PropertyGroup>
<TargetFrameworkIdentifier>.NETCoreApp</TargetFrameworkIdentifier>
<_TargetFrameworkVersionWithoutV>2.0</_TargetFrameworkVersionWithoutV>
<LangVersion>55.0</LangVersion>
</PropertyGroup>
<Import Project=""Microsoft.CSharp.Core.targets"" />
</Project>
"));
var instance = CreateProjectInstance(xmlReader);
instance.Build(GetTestLoggers());
var langVersion = instance.GetPropertyValue("LangVersion");
var maxLangVersion = instance.GetPropertyValue("_MaxSupportedLangVersion");
Assert.Equal("55.0", langVersion);
Assert.Equal("7.3", maxLangVersion);
}
[Fact] [Fact]
public void GenerateEditorConfigIsPassedToTheCompiler() public void GenerateEditorConfigIsPassedToTheCompiler()
{ {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册