Пример #1
0
        private async Task <Workspace> TypeCheckWorkspaceAsync(Workspace workspace)
        {
            var frontEndStatistics        = new FrontEndStatistics(); // don't pollute global statistics with this
            var semanticWorkspaceProvider = new SemanticWorkspaceProvider(frontEndStatistics, WorkspaceConfiguration);

            workspace = await semanticWorkspaceProvider.ComputeSemanticWorkspaceAsync(Context.PathTable, workspace);

            if (workspace.GetSemanticModel().GetAllSemanticDiagnostics().Any())
            {
                return(workspace.WithExtraFailures(new[] { new Failure <string>("Failed to type check configuration") }));
            }

            return(workspace);
        }
Пример #2
0
        private Workspace GetWorkspace(ModuleRepository moduleRepository)
        {
            var workspaceProvider = CreateWorkspaceProviderFromContent(false, moduleRepository);
            var workspace         = workspaceProvider.CreateWorkspaceFromAllKnownModulesAsync().GetAwaiter().GetResult();

            var semanticWorkspaceProvider = new SemanticWorkspaceProvider(m_frontEndStatistics, workspace.WorkspaceConfiguration);
            var semanticWorkspace         = semanticWorkspaceProvider.ComputeSemanticWorkspaceAsync(PathTable, workspace).GetAwaiter().GetResult();

            var semanticModel = semanticWorkspace.GetSemanticModel();

            if (semanticModel.GetAllSemanticDiagnostics().Any())
            {
                var errors = string.Join("\r\n", semanticModel.GetAllSemanticDiagnostics());
                XAssert.Fail("Semantic model is expected to be error free.  Errors found " + errors);
            }

            return(semanticWorkspace);
        }
Пример #3
0
        /// <nodoc/>
        public Expression ParseExpression(RuntimeModelContext runtimeModelContext, AbsolutePath path, string spec, FunctionScope localScope, bool useSemanticNameResolution)
        {
            Contract.Requires(runtimeModelContext != null);
            Contract.Requires(spec != null);

            var parser = new TypeScript.Net.Parsing.Parser();

            // Wrap expression in a function call to make the parser happy.
            // Currently an object literal '{...};' is not a valid statement.
            var sourceFile = parser.ParseSourceFileContent(
                path.ToString(runtimeModelContext.PathTable),
                @"function createExpression(a: any) {}
createExpression(" + spec + ");");

            if (sourceFile.ParseDiagnostics.Count != 0)
            {
                ReportParseDiagnosticsIfNeeded(runtimeModelContext, sourceFile, path);
                return(null);
            }

            var workspaceConfiguration = WorkspaceConfiguration.CreateForTesting();
            var workspace = new Workspace(
                provider: null,
                workspaceConfiguration: workspaceConfiguration,
                modules: new[] { CreateModuleFor(runtimeModelContext, sourceFile) },
                failures: Enumerable.Empty <Failure>(),
                preludeModule: null,
                configurationModule: null);

            workspace = SemanticWorkspaceProvider.ComputeSemanticWorkspace(runtimeModelContext.PathTable, workspace, workspaceConfiguration).GetAwaiter().GetResult();

            // Because we just created source file to parse, we know exactly what the AST is there.
            // This information helped to simplify analysis logic and migrate to semantic-base name resolution.
            var invocation = sourceFile.Statements[1].Cast <IExpressionStatement>().Expression.Cast <ICallExpression>();

            // Only for expressions, full names should be preserved.
            // Only for expressions, no checks for definition before use to avoid contract assertion in location computation.
            m_conversionConfiguration.UnsafeOptions.DisableDeclarationBeforeUseCheck = true;
            var converter = CreateAstConverter(sourceFile, runtimeModelContext, path, m_conversionConfiguration, workspace: workspace);

            return(converter.ConvertExpression(invocation, localScope, useSemanticNameResolution));
        }
Пример #4
0
        /// <summary>
        /// Creates a semantic workspace from the given moduleRepositories. If <paramref name="initialModule"/> is specified,
        /// the workspace will contain only those modules required by the <paramref name="initialModule"/> module; otherwise,
        /// the workspace will contain all known modules.
        /// </summary>
        /// <remarks>
        /// Consider that if modules are not unique across the array, the file system will be given the union of the specs
        /// that belong to the same module in some order.
        /// </remarks>
        public async Task <Workspace> CreateSematicWorkspaceFromContent(
            ModuleDescriptor?initialModule,
            bool preserveTrivia = false,
            params ModuleRepository[] moduleRepositoryArray)
        {
            var workspaceProvider = CreateWorkspaceProviderFromContent(preserveTrivia: preserveTrivia, moduleRepositoryArray: moduleRepositoryArray);
            var workspace         = initialModule != null
                ? await workspaceProvider.CreateWorkspaceFromModuleAsync(initialModule.Value)
                : await workspaceProvider.CreateWorkspaceFromAllKnownModulesAsync();

            if (!workspace.Succeeded)
            {
                Assert.True(
                    false,
                    "Error building workspace:" +
                    Environment.NewLine +
                    string.Join(
                        Environment.NewLine,
                        workspace.Failures.Select(
                            f =>
                {
                    var parseFail = f as ParsingFailure;
                    if (parseFail != null)
                    {
                        return(f.Describe() + string.Join(Environment.NewLine, parseFail.ParseDiagnostics.Select(d => d.ToString())));
                    }

                    return(f.Describe());
                })));
            }

            var sematicWorkspaceProvider = new SemanticWorkspaceProvider(workspaceProvider.Statistics, workspaceProvider.Configuration);
            var sematicWorkspace         = await sematicWorkspaceProvider.ComputeSemanticWorkspaceAsync(PathTable, workspace);

            return(sematicWorkspace);
        }
Пример #5
0
        private Task <Workspace> ComputeSemanticWorkspaceAsync(Workspace workspace, WorkspaceConfiguration workspaceConfiguration)
        {
            var semanticWorkspaceProvider = new SemanticWorkspaceProvider(m_frontEndStatistics, workspaceConfiguration);

            return(semanticWorkspaceProvider.ComputeSemanticWorkspaceAsync(FrontEndContext.PathTable, workspace));
        }
Пример #6
0
        private Workspace GetUpdatedWorkspace(ParsedModule parsedModule, ModuleDefinition moduleDefinition, AbsolutePath path)
        {
            // Need to use both 'ParsedModule' and 'ModuleDefinition' in case if the 'path' is newly added
            // file and was not parsed yet.

            // All already parsed modules are good to go
            var unchangedModules = m_workspace.SpecModules;

            // We build a module under construction that has all specs but the one that changed
            var moduleUnderConstruction = new ModuleUnderConstruction(moduleDefinition);

            foreach (var spec in parsedModule.Specs)
            {
                if (spec.Key != path)
                {
                    moduleUnderConstruction.AddParsedSpec(spec.Key, spec.Value);
                }
            }

            // Update parsing failures so the ones coming from the changed spec are removed
            var filteredFailures = m_workspace.Failures.Where(
                failure => (failure is ParsingFailure parsingFailure && parsingFailure.SourceFile.Path.AbsolutePath != path.ToString(m_pathTable)));

            var updatedWorkspace =
                m_workspace.WorkspaceProvider.CreateIncrementalWorkspaceForAllKnownModulesAsync(
                    unchangedModules,
                    moduleUnderConstruction,
                    filteredFailures,
                    m_workspace.PreludeModule)
                .GetAwaiter()
                .GetResult();

            var semanticWorkspaceProvider = new SemanticWorkspaceProvider(new WorkspaceStatistics(), m_workspace.WorkspaceConfiguration);
            var semanticWorkspace         =
                semanticWorkspaceProvider.ComputeSemanticWorkspaceAsync(m_pathTable, updatedWorkspace, m_workspace.GetSemanticModel(), incrementalMode: true)
                .GetAwaiter()
                .GetResult();

            // Get all the potentially new specs. Old ones, besides the one that changed, were aready linted
            var newPathToSpecs =
                updatedWorkspace.GetAllSpecFiles()
                .Except(m_workspace.GetAllSpecFiles())
                .Concat(new[] { path });

            // The changed spec always needs linting. Plus all the new ones the changed spec may have introduced.
            var preludeModule = updatedWorkspace.PreludeModule;
            var specsToLint   = new HashSet <ISourceFile>();

            foreach (var pathToSpec in newPathToSpecs)
            {
                // Need to exclude prelude files from liinting.
                // Need to keep config files. They should be linted.
                if (preludeModule == null || !preludeModule.Specs.ContainsKey(pathToSpec))
                {
                    specsToLint.Add(updatedWorkspace.GetSourceFile(pathToSpec));
                }
            }

            var lintedWorkspace = WorkspaceBuilder.CreateLintedWorkspaceForChangedSpecs(
                semanticWorkspace,
                specsToLint,
                m_controller.FrontEndContext.LoggingContext,
                m_controller.FrontEndConfiguration,
                m_controller.FrontEndContext.PathTable);

            return(lintedWorkspace);
        }