void SwiftInterfaceGenContext::reportEditorInfo(EditorConsumer &Consumer) const { Consumer.handleSourceText(Impl.Info.Text); reportSyntacticAnnotations(Impl.TextCI, Consumer); reportDocumentStructure(Impl.TextCI, Consumer); reportSemanticAnnotations(Impl.Info, Consumer); Consumer.finished(); }
//===----------------------------------------------------------------------===// // EditorOpenTypeInterface //===----------------------------------------------------------------------===// void SwiftLangSupport::editorOpenTypeInterface(EditorConsumer &Consumer, ArrayRef<const char *> Args, StringRef TypeUSR) { CompilerInstance CI; // Display diagnostics to stderr. PrintingDiagnosticConsumer PrintDiags; CI.addDiagnosticConsumer(&PrintDiags); CompilerInvocation Invocation; std::string Error; if (getASTManager().initCompilerInvocation(Invocation, Args, CI.getDiags(), StringRef(), Error)) { Consumer.handleRequestError(Error.c_str()); return; } Invocation.getClangImporterOptions().ImportForwardDeclarations = true; std::string ErrMsg; auto IFaceGenRef = SwiftInterfaceGenContext::createForTypeInterface( Invocation, TypeUSR, ErrMsg); if (!IFaceGenRef) { Consumer.handleRequestError(ErrMsg.c_str()); return; } IFaceGenRef->reportEditorInfo(Consumer); // reportEditorInfo requires exclusive access to the AST, so don't add this // to the service cache until it has returned. IFaceGenContexts.set(TypeUSR, IFaceGenRef); }
void SwiftLangSupport::editorOpenHeaderInterface(EditorConsumer &Consumer, StringRef Name, StringRef HeaderName, ArrayRef<const char *> Args, bool UsingSwiftArgs, bool SynthesizedExtensions, StringRef swiftVersion) { CompilerInstance CI; // Display diagnostics to stderr. PrintingDiagnosticConsumer PrintDiags; CI.addDiagnosticConsumer(&PrintDiags); CompilerInvocation Invocation; std::string Error; ArrayRef<const char *> SwiftArgs = UsingSwiftArgs ? Args : llvm::None; if (getASTManager().initCompilerInvocationNoInputs(Invocation, SwiftArgs, CI.getDiags(), Error)) { Consumer.handleRequestError(Error.c_str()); return; } if (!UsingSwiftArgs && initInvocationByClangArguments(Args, Invocation, Error)) { Consumer.handleRequestError(Error.c_str()); return; } Invocation.getClangImporterOptions().ImportForwardDeclarations = true; if (!swiftVersion.empty()) { auto swiftVer = version::Version::parseVersionString(swiftVersion, SourceLoc(), nullptr); if (swiftVer.hasValue()) Invocation.getLangOptions().EffectiveLanguageVersion = swiftVer.getValue(); } auto IFaceGenRef = SwiftInterfaceGenContext::create(Name, /*IsModule=*/false, HeaderName, None, Invocation, Error, SynthesizedExtensions, None); if (!IFaceGenRef) { Consumer.handleRequestError(Error.c_str()); return; } IFaceGenRef->reportEditorInfo(Consumer); // reportEditorInfo requires exclusive access to the AST, so don't add this // to the service cache until it has returned. IFaceGenContexts.set(Name, IFaceGenRef); }
//===----------------------------------------------------------------------===// // EditorOpenInterface //===----------------------------------------------------------------------===// void SwiftLangSupport::editorOpenInterface(EditorConsumer &Consumer, StringRef Name, StringRef ModuleName, Optional<StringRef> Group, ArrayRef<const char *> Args, bool SynthesizedExtensions, Optional<StringRef> InterestedUSR) { CompilerInstance CI; // Display diagnostics to stderr. PrintingDiagnosticConsumer PrintDiags; CI.addDiagnosticConsumer(&PrintDiags); CompilerInvocation Invocation; std::string Error; if (getASTManager().initCompilerInvocationNoInputs(Invocation, Args, CI.getDiags(), Error)) { Consumer.handleRequestError(Error.c_str()); return; } trace::TracedOperation TracedOp; if (trace::enabled()) { trace::SwiftInvocation SwiftArgs; SwiftArgs.Args.Args.assign(Args.begin(), Args.end()); // NOTE: do not use primary file // NOTE: do not use files TracedOp.start(trace::OperationKind::OpenInterface, SwiftArgs, {std::make_pair("Name", Name), std::make_pair("ModuleName", ModuleName)}); } Invocation.getClangImporterOptions().ImportForwardDeclarations = true; std::string ErrMsg; auto IFaceGenRef = SwiftInterfaceGenContext::create(Name, /*IsModule=*/true, ModuleName, Group, Invocation, ErrMsg, SynthesizedExtensions, InterestedUSR); if (!IFaceGenRef) { Consumer.handleRequestError(ErrMsg.c_str()); return; } IFaceGenRef->reportEditorInfo(Consumer); // reportEditorInfo requires exclusive access to the AST, so don't add this // to the service cache until it has returned. IFaceGenContexts.set(Name, IFaceGenRef); }
void SwiftLangSupport::editorOpenHeaderInterface(EditorConsumer &Consumer, StringRef Name, StringRef HeaderName, ArrayRef<const char *> Args) { CompilerInstance CI; // Display diagnostics to stderr. PrintingDiagnosticConsumer PrintDiags; CI.addDiagnosticConsumer(&PrintDiags); CompilerInvocation Invocation; std::string Error; if (getASTManager().initCompilerInvocation(Invocation, llvm::None, CI.getDiags(), StringRef(), Error)) { Consumer.handleRequestError(Error.c_str()); return; } if (initInvocationByClangArguments(Args, Invocation, Error)) { Consumer.handleRequestError(Error.c_str()); return; } trace::TracedOperation TracedOp; if (trace::enabled()) { trace::SwiftInvocation SwiftArgs; SwiftArgs.Args.Args.assign(Args.begin(), Args.end()); // NOTE: do not use primary file // NOTE: do not use files TracedOp.start(trace::OperationKind::OpenHeaderInterface, SwiftArgs, {std::make_pair("Name", Name), std::make_pair("HeaderName", HeaderName)}); } Invocation.getClangImporterOptions().ImportForwardDeclarations = true; auto IFaceGenRef = SwiftInterfaceGenContext::create(Name, /*IsModule=*/false, HeaderName, None, Invocation, Error); if (!IFaceGenRef) { Consumer.handleRequestError(Error.c_str()); return; } IFaceGenContexts.set(Name, IFaceGenRef); IFaceGenRef->reportEditorInfo(Consumer); }
static void reportSemanticAnnotations(const SourceTextInfo &IFaceInfo, EditorConsumer &Consumer) { for (auto &Ref : IFaceInfo.References) { UIdent Kind; bool IsSystem; if (Ref.Mod) { Kind = SwiftLangSupport::getUIDForModuleRef(); IsSystem = Ref.Mod.isSystemModule(); } else if (Ref.Dcl) { Kind = SwiftLangSupport::getUIDForDecl(Ref.Dcl, /*IsRef=*/true); IsSystem = Ref.Dcl->getModuleContext()->isSystemModule(); } if (Kind.isInvalid()) continue; unsigned Offset = Ref.Range.Offset; unsigned Length = Ref.Range.Length; Consumer.handleSemanticAnnotation(Offset, Length, Kind, IsSystem); } }
void SwiftLangSupport::editorOpenHeaderInterface(EditorConsumer &Consumer, StringRef Name, StringRef HeaderName, ArrayRef<const char *> Args, bool UsingSwiftArgs, bool SynthesizedExtensions, Optional<unsigned> swiftVersion) { CompilerInstance CI; // Display diagnostics to stderr. PrintingDiagnosticConsumer PrintDiags; CI.addDiagnosticConsumer(&PrintDiags); CompilerInvocation Invocation; std::string Error; ArrayRef<const char *> SwiftArgs = UsingSwiftArgs ? Args : llvm::None; if (getASTManager().initCompilerInvocationNoInputs(Invocation, SwiftArgs, CI.getDiags(), Error)) { Consumer.handleRequestError(Error.c_str()); return; } if (!UsingSwiftArgs && initInvocationByClangArguments(Args, Invocation, Error)) { Consumer.handleRequestError(Error.c_str()); return; } trace::TracedOperation TracedOp; if (trace::enabled()) { trace::SwiftInvocation SwiftArgs; SwiftArgs.Args.Args.assign(Args.begin(), Args.end()); // NOTE: do not use primary file // NOTE: do not use files TracedOp.start(trace::OperationKind::OpenHeaderInterface, SwiftArgs, {std::make_pair("Name", Name), std::make_pair("HeaderName", HeaderName)}); } Invocation.getClangImporterOptions().ImportForwardDeclarations = true; if (swiftVersion.hasValue()) { auto swiftVer = version::Version({swiftVersion.getValue()}); Invocation.getLangOptions().EffectiveLanguageVersion = swiftVer; } auto IFaceGenRef = SwiftInterfaceGenContext::create(Name, /*IsModule=*/false, HeaderName, None, Invocation, Error, SynthesizedExtensions, None); if (!IFaceGenRef) { Consumer.handleRequestError(Error.c_str()); return; } IFaceGenRef->reportEditorInfo(Consumer); // reportEditorInfo requires exclusive access to the AST, so don't add this // to the service cache until it has returned. IFaceGenContexts.set(Name, IFaceGenRef); }