diff options
| author | Yong He <yonghe@outlook.com> | 2023-12-15 16:30:09 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-12-15 16:30:09 -0800 |
| commit | f8b3027d0be0b890152a6a649822741cd3a3b6b6 (patch) | |
| tree | 7180b8063f0b99be4b4ee31288214b59ccc461ff /source | |
| parent | 21d17abb0e511806b7c93effc58f37169d837766 (diff) | |
Add language server support for vfx files. (#3414)
Co-authored-by: Yong He <yhe@nvidia.com>
Diffstat (limited to 'source')
| -rw-r--r-- | source/slang/slang-parser.cpp | 68 | ||||
| -rw-r--r-- | source/slang/slang-workspace-version.cpp | 32 | ||||
| -rw-r--r-- | source/slang/slang-workspace-version.h | 8 |
3 files changed, 108 insertions, 0 deletions
diff --git a/source/slang/slang-parser.cpp b/source/slang/slang-parser.cpp index 1fd8bffcc..7be03a313 100644 --- a/source/slang/slang-parser.cpp +++ b/source/slang/slang-parser.cpp @@ -3046,6 +3046,22 @@ namespace Slang link = &semantic->next; } + // If we see a '<', ignore the remaining. + if (AdvanceIf(parser, TokenType::OpLess)) + { + for (;;) + { + auto token = parser->tokenReader.peekToken(); + if (token.type == TokenType::EndOfFile) + break; + else if (token.type == TokenType::OpGreater) + break; + else + parser->tokenReader.advanceToken(); + } + parser->ReadToken(TokenType::OpGreater); + } + // If we see another `:`, then that means there // is yet another semantic to be processed. // Otherwise we assume we are at the end of the list. @@ -3482,6 +3498,54 @@ namespace Slang return decl; } + static NodeBase* parseIgnoredBlockDecl(Parser* parser, void*) + { + parser->ReadToken(TokenType::LBrace); + int remaingingBraceToClose = 1; + for (;;) + { + auto token = parser->ReadToken(); + if (token.type == TokenType::RBrace) + { + remaingingBraceToClose--; + if (remaingingBraceToClose == 0) + break; + } + else if (token.type == TokenType::LBrace) + { + remaingingBraceToClose++; + } + else if (token.type == TokenType::EndOfFile) + { + break; + } + } + auto decl = parser->astBuilder->create<EmptyDecl>(); + parser->FillPosition(decl); + return decl; + } + + static NodeBase* parseTransparentBlockDecl(Parser* parser, void*) + { + if (parser->currentScope && parser->currentScope->containerDecl) + { + parseDeclBody(parser, parser->currentScope->containerDecl); + return nullptr; + } + else + { + SLANG_UNEXPECTED("parseTransparentBlock should be called with a valid scope."); + } + } + + static NodeBase* parseFileDecl(Parser* parser, void*) + { + auto fileDecl = parser->astBuilder->create<FileDecl>(); + parser->FillPosition(fileDecl); + parseDeclBody(parser, fileDecl); + return fileDecl; + } + static NodeBase* parseConstructorDecl(Parser* parser, void* /*userData*/) { ConstructorDecl* decl = parser->astBuilder->create<ConstructorDecl>(); @@ -7782,6 +7846,10 @@ namespace Slang _makeParseDecl("__generic_value_param", parseGlobalGenericValueParamDecl ), _makeParseDecl("namespace", parseNamespaceDecl ), _makeParseDecl("using", parseUsingDecl ), + _makeParseDecl("__ignored_block", parseIgnoredBlockDecl ), + _makeParseDecl("__transparent_block", parseTransparentBlockDecl), + _makeParseDecl("__file_decl", parseFileDecl), + // !!!!!!!!!!!!!!!!!!!!!! Modifer !!!!!!!!!!!!!!!!!!!!!! diff --git a/source/slang/slang-workspace-version.cpp b/source/slang/slang-workspace-version.cpp index 86cdd000a..9a707aae7 100644 --- a/source/slang/slang-workspace-version.cpp +++ b/source/slang/slang-workspace-version.cpp @@ -496,6 +496,35 @@ ASTMarkup* WorkspaceVersion::getOrCreateMarkupAST(ModuleDecl* module) return astMarkup.Ptr(); } +void WorkspaceVersion::ensureWorkspaceFlavor(UnownedStringSlice path) +{ + if (flavor != WorkspaceFlavor::Standard) + return; + + if (path.endsWithCaseInsensitive(".vfx")) + { + // Setup linkage for vfx files. + // TODO: consider supporting this as an external config file. + flavor = WorkspaceFlavor::VFX; + linkage->setEnableEffectAnnotations(true); + linkage->addPreprocessorDefine("VS", "__file_decl"); + linkage->addPreprocessorDefine("CS", "__file_decl"); + linkage->addPreprocessorDefine("GS", "__file_decl"); + linkage->addPreprocessorDefine("PS", "__file_decl"); + linkage->addPreprocessorDefine("RTX", "__file_decl"); + linkage->addPreprocessorDefine("PS_RTX", "__file_decl"); + linkage->addPreprocessorDefine("VS_RTX", "__file_decl"); + linkage->addPreprocessorDefine("FRAGMENT_ANNOTATION", ""); + linkage->addPreprocessorDefine("DynamicCombo", "//"); + linkage->addPreprocessorDefine("DynamicComboRule", "//"); + linkage->addPreprocessorDefine("HEADER", "__ignored_block"); + linkage->addPreprocessorDefine("MODES", "__ignored_block"); + linkage->addPreprocessorDefine("PS_RENDER_STATE", "__ignored_block"); + linkage->addPreprocessorDefine("FEATURES", "__ignored_block"); + linkage->addPreprocessorDefine("COMMON", "__transparent_block"); + } +} + Module* WorkspaceVersion::getOrLoadModule(String path) { Module* module; @@ -512,6 +541,9 @@ Module* WorkspaceVersion::getOrLoadModule(String path) auto moduleName = getMangledNameFromNameString(path.getUnownedSlice()); linkage->contentAssistInfo.primaryModuleName = linkage->getNamePool()->getName(moduleName); linkage->contentAssistInfo.primaryModulePath = path; + + ensureWorkspaceFlavor(path.getUnownedSlice()); + // Note: // The module at `path` may have already been loaded into the linkage previously // due to an `import`. However that module won't get fully checked in when the checker diff --git a/source/slang/slang-workspace-version.h b/source/slang/slang-workspace-version.h index bab9c963d..28d6e1fe2 100644 --- a/source/slang/slang-workspace-version.h +++ b/source/slang/slang-workspace-version.h @@ -108,6 +108,12 @@ namespace Slang String originalOutput; }; + enum class WorkspaceFlavor + { + Standard, + VFX, + }; + class WorkspaceVersion : public RefObject { private: @@ -117,10 +123,12 @@ namespace Slang void parseDiagnostics(String compilerOutput); public: Workspace* workspace; + WorkspaceFlavor flavor = WorkspaceFlavor::Standard; RefPtr<Linkage> linkage; Dictionary<String, DocumentDiagnostics> diagnostics; ASTMarkup* getOrCreateMarkupAST(ModuleDecl* module); Module* getOrLoadModule(String path); + void ensureWorkspaceFlavor(UnownedStringSlice path); MacroDefinitionContentAssistInfo* tryGetMacroDefinition(UnownedStringSlice name); }; |
