예제 #1
0
        static LanguageFeatures GetLanguageFeatures(PhpParseOptions options)
        {
            var version  = options.LanguageVersion;
            var features = ParseLanguageVersion(ref version);

            //
            if (options.AllowShortOpenTags)
            {
                features |= LanguageFeatures.ShortOpenTags;
            }

            //
            return(features);
        }
예제 #2
0
        ///// <summary>
        ///// Flags applied to the top-level binder created for each syntax tree in the compilation
        ///// as well as for the binder of global imports.
        ///// </summary>
        //internal BinderFlags TopLevelBinderFlags { get; private set; }

        // Defaults correspond to the compiler's defaults or indicate that the user did not specify when that is significant.
        // That's significant when one option depends on another's setting. SubsystemVersion depends on Platform and Target.
        public PhpCompilationOptions(
            OutputKind outputKind,
            string baseDirectory,
            string sdkDirectory,
            bool reportSuppressedDiagnostics = false,
            string moduleName      = null,
            string mainTypeName    = null,
            string scriptClassName = null,
            OptimizationLevel optimizationLevel = OptimizationLevel.Debug,
            bool checkOverflow                    = false,
            string cryptoKeyContainer             = null,
            string cryptoKeyFile                  = null,
            ImmutableArray <byte> cryptoPublicKey = default(ImmutableArray <byte>),
            bool?delaySign    = null,
            Platform platform = Platform.AnyCpu,
            ReportDiagnostic generalDiagnosticOption = ReportDiagnostic.Default,
            int warningLevel = 4,
            IEnumerable <KeyValuePair <string, ReportDiagnostic> > specificDiagnosticOptions = null,
            bool concurrentBuild = true,
            bool deterministic   = false,
            XmlReferenceResolver xmlReferenceResolver           = null,
            SourceReferenceResolver sourceReferenceResolver     = null,
            MetadataReferenceResolver metadataReferenceResolver = null,
            AssemblyIdentityComparer assemblyIdentityComparer   = null,
            StrongNameProvider strongNameProvider = null,
            bool publicSign         = false,
            PhpDocTypes phpdocTypes = PhpDocTypes.None,
            ImmutableArray <Diagnostic> diagnostics = default(ImmutableArray <Diagnostic>),
            PhpParseOptions parseOptions            = null)
            : this(outputKind, baseDirectory, sdkDirectory,
                   reportSuppressedDiagnostics, moduleName, mainTypeName, scriptClassName,
                   optimizationLevel, checkOverflow,
                   cryptoKeyContainer, cryptoKeyFile, cryptoPublicKey, delaySign, platform,
                   generalDiagnosticOption, warningLevel,
                   specificDiagnosticOptions, concurrentBuild, deterministic,
                   extendedCustomDebugInformation : true,
                   debugPlusMode : false,
                   xmlReferenceResolver : xmlReferenceResolver,
                   sourceReferenceResolver : sourceReferenceResolver,
                   metadataReferenceResolver : metadataReferenceResolver,
                   assemblyIdentityComparer : assemblyIdentityComparer,
                   strongNameProvider : strongNameProvider,
                   metadataImportOptions : MetadataImportOptions.Public,
                   publicSign : publicSign,
                   phpdocTypes : phpdocTypes,
                   diagnostics : diagnostics,
                   parseOptions : parseOptions)
        {
        }
예제 #3
0
 // Expects correct arguments.
 internal PhpCompilationOptions(
     OutputKind outputKind,
     string baseDirectory,
     string sdkDirectory,
     bool reportSuppressedDiagnostics,
     string moduleName,
     string mainTypeName,
     string scriptClassName,
     string versionString,
     OptimizationLevel optimizationLevel,
     bool checkOverflow,
     string cryptoKeyContainer,
     string cryptoKeyFile,
     ImmutableArray<byte> cryptoPublicKey,
     bool? delaySign,
     Platform platform,
     ReportDiagnostic generalDiagnosticOption,
     int warningLevel,
     IEnumerable<KeyValuePair<string, ReportDiagnostic>> specificDiagnosticOptions,
     bool concurrentBuild,
     bool deterministic,
     DateTime currentLocalTime,
     bool debugPlusMode,
     XmlReferenceResolver xmlReferenceResolver,
     SourceReferenceResolver sourceReferenceResolver,
     MetadataReferenceResolver metadataReferenceResolver,
     AssemblyIdentityComparer assemblyIdentityComparer,
     StrongNameProvider strongNameProvider,
     MetadataImportOptions metadataImportOptions,
     bool publicSign,
     PhpDocTypes phpdocTypes,
     ImmutableArray<Diagnostic> diagnostics,
     PhpParseOptions parseOptions,
     bool referencesSupersedeLowerVersions)
     : base(outputKind, reportSuppressedDiagnostics, moduleName, mainTypeName, scriptClassName,
            cryptoKeyContainer, cryptoKeyFile, cryptoPublicKey, delaySign, publicSign, optimizationLevel, checkOverflow,
            platform, generalDiagnosticOption, warningLevel, specificDiagnosticOptions.ToImmutableDictionaryOrEmpty(),
            concurrentBuild, deterministic, currentLocalTime, debugPlusMode, xmlReferenceResolver,
            sourceReferenceResolver, metadataReferenceResolver, assemblyIdentityComparer,
            strongNameProvider, metadataImportOptions, referencesSupersedeLowerVersions)
 {
     this.BaseDirectory = baseDirectory;
     this.SdkDirectory = sdkDirectory;
     this.PhpDocTypes = phpdocTypes;
     this.ParseOptions = parseOptions;
     this.Diagnostics = diagnostics;
     this.VersionString = versionString;
 }
예제 #4
0
        public static PhpSyntaxTree ParseCode(
            string content,
            PhpParseOptions parseOptions,
            PhpParseOptions scriptParseOptions,
            string fname)
        {
            if (fname == null)
            {
                throw new ArgumentNullException(nameof(fname));
            }

            // TODO: new parser implementation based on Roslyn

            // TODO: file.IsScript ? scriptParseOptions : parseOptions
            var unit = new CodeSourceUnit(
                content, fname, Encoding.UTF8,
                (parseOptions.Kind == SourceCodeKind.Regular) ? Lexer.LexicalStates.INITIAL : Lexer.LexicalStates.ST_IN_SCRIPTING, GetLanguageFeatures(parseOptions));

            var result = new PhpSyntaxTree(unit);

            var errorSink = new ErrorSink(result);
            var factory   = new NodesFactory(unit, parseOptions.Defines);

            //
            unit.Parse(factory, errorSink);

            //
            result.Diagnostics = errorSink.Diagnostics;

            result.Lambdas    = factory.Lambdas.AsImmutableSafe();
            result.Types      = factory.Types.AsImmutableSafe();
            result.Functions  = factory.Functions.AsImmutableSafe();
            result.YieldNodes = factory.YieldNodes.AsImmutableSafe();

            if (factory.Root != null)
            {
                result.Root = factory.Root;
            }
            else
            {
                // Parser leaves factory.Root to null in the case of syntax errors -> create a proxy syntax node
                var fullSpan = new Devsense.PHP.Text.Span(0, unit.Code.Length);
                result.Root = new GlobalCode(fullSpan, ImmutableArray <Statement> .Empty, unit);
            }

            //
            return(result);
        }
예제 #5
0
        public static PhpSyntaxTree ParseCode(
            string content,
            PhpParseOptions parseOptions,
            PhpParseOptions scriptParseOptions,
            string fname)
        {
            // TODO: new parser implementation based on Roslyn

            // TODO: file.IsScript ? scriptParseOptions : parseOptions
            var unit   = new CodeSourceUnit(content.ToString(), fname, Encoding.UTF8);
            var result = new PhpSyntaxTree(unit);

            var errorSink = new ErrorSink(result);

            unit.Parse(new BasicNodesFactory(unit), errorSink);
            result.Diagnostics = errorSink.Diagnostics;

            return(result);
        }