Ejemplo n.º 1
0
        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)
                       ));
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        /// <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)));
            }
        }
Ejemplo n.º 5
0
        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)));
        }
Ejemplo n.º 6
0
        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());
        }