private static CSDiagnosticInfo GetDisabledFeatureDiagnosticInfo( MessageID feature, LanguageVersion availableVersion ) { string?requiredFeature = feature.RequiredFeature(); if (requiredFeature != null) { return(new CSDiagnosticInfo( ErrorCode.ERR_FeatureIsExperimental, feature.Localize(), requiredFeature )); } LanguageVersion requiredVersion = feature.RequiredVersion(); return(requiredVersion == LanguageVersion.Preview.MapSpecifiedToEffectiveVersion() ? new CSDiagnosticInfo(ErrorCode.ERR_FeatureInPreview, feature.Localize()) : new CSDiagnosticInfo( availableVersion.GetErrorCode(), feature.Localize(), new CSharpRequiredLanguageVersion(requiredVersion) )); }
internal bool IsFeatureEnabled(MessageID feature) { switch (feature) { case MessageID.IDS_FeatureBinaryLiteral: case MessageID.IDS_FeatureDigitSeparator: case MessageID.IDS_FeatureLocalFunctions: case MessageID.IDS_FeatureRefLocalsReturns: case MessageID.IDS_FeaturePatternMatching: case MessageID.IDS_FeatureTuples: case MessageID.IDS_FeatureReplace: // in "demo" mode enable proposed new C# 7 language features. if (PreprocessorSymbols.Contains("__DEMO__")) { return(true); } break; default: break; } string featureFlag = feature.RequiredFeature(); if (featureFlag != null) { return(Features.ContainsKey(featureFlag)); } LanguageVersion availableVersion = LanguageVersion; LanguageVersion requiredVersion = feature.RequiredVersion(); return(availableVersion >= requiredVersion); }
internal bool IsFeatureEnabled(MessageID feature) { string?featureFlag = feature.RequiredFeature(); if (featureFlag != null) { return(Features.ContainsKey(featureFlag)); } LanguageVersion availableVersion = LanguageVersion; LanguageVersion requiredVersion = feature.RequiredVersion(); return(availableVersion >= requiredVersion); }
/// <remarks> /// NOTE: we are specifically diverging from dev11 to improve the user experience. /// Since treating the "async" keyword as an identifier in older language /// versions can never result in a correct program, we instead accept it as a /// keyword regardless of the language version and produce an error if the version /// is insufficient. /// </remarks> protected TNode CheckFeatureAvailability <TNode>(TNode node, MessageID feature, bool forceWarning = false) where TNode : GreenNode { LanguageVersion availableVersion = this.Options.LanguageVersion; if (feature == MessageID.IDS_FeatureModuleAttrLoc) { // There's a special error code for this feature, so handle it separately. return(availableVersion >= LanguageVersion.CSharp2 ? node : this.AddError(node, ErrorCode.WRN_NonECMAFeature, feature.Localize())); } if (IsFeatureEnabled(feature)) { return(node); } var featureName = feature.Localize(); var requiredFeature = feature.RequiredFeature(); if (requiredFeature != null) { if (forceWarning) { SyntaxDiagnosticInfo rawInfo = new SyntaxDiagnosticInfo(ErrorCode.ERR_FeatureIsExperimental, featureName, requiredFeature); return(this.AddError(node, ErrorCode.WRN_ErrorOverride, rawInfo, rawInfo.Code)); } return(this.AddError(node, ErrorCode.ERR_FeatureIsExperimental, featureName, requiredFeature)); } else { var requiredVersion = feature.RequiredVersion(); if (forceWarning) { SyntaxDiagnosticInfo rawInfo = new SyntaxDiagnosticInfo(availableVersion.GetErrorCode(), featureName, new CSharpRequiredLanguageVersion(requiredVersion)); return(this.AddError(node, ErrorCode.WRN_ErrorOverride, rawInfo, rawInfo.Code)); } return(this.AddError(node, availableVersion.GetErrorCode(), featureName, new CSharpRequiredLanguageVersion(requiredVersion))); } }
internal static CSDiagnosticInfo GetFeatureAvailabilityDiagnosticInfo(this MessageID feature, CSharpParseOptions options) { LanguageVersion requiredVersion; if (options.IsFeatureEnabled(feature)) { return(null); } string requiredFeature = feature.RequiredFeature(); if (requiredFeature != null) { return(new CSDiagnosticInfo(ErrorCode.ERR_FeatureIsExperimental, feature.Localize(), requiredFeature)); } LanguageVersion availableVersion = options.LanguageVersion; requiredVersion = feature.RequiredVersion(); return(requiredVersion == LanguageVersion.Preview.MapSpecifiedToEffectiveVersion() ? new CSDiagnosticInfo(ErrorCode.ERR_FeatureInPreview, feature.Localize()) : new CSDiagnosticInfo(availableVersion.GetErrorCode(), feature.Localize(), new CSharpRequiredLanguageVersion(requiredVersion))); }
private void CheckFeatureAvailability(MessageID feature) { var options = this.Options; if (options.IsFeatureEnabled(feature)) { return; } string requiredFeature = feature.RequiredFeature(); if (requiredFeature != null) { if (!options.IsFeatureEnabled(feature)) { this.AddError(ErrorCode.ERR_FeatureIsExperimental, feature.Localize(), requiredFeature); } return; } LanguageVersion availableVersion = this.Options.LanguageVersion; var requiredVersion = feature.RequiredVersion(); if (availableVersion >= requiredVersion) return; var featureName = feature.Localize(); this.AddError(availableVersion.GetErrorCode(), featureName, requiredVersion.Localize()); }