summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2023-12-15 16:30:09 -0800
committerGitHub <noreply@github.com>2023-12-15 16:30:09 -0800
commitf8b3027d0be0b890152a6a649822741cd3a3b6b6 (patch)
tree7180b8063f0b99be4b4ee31288214b59ccc461ff /source
parent21d17abb0e511806b7c93effc58f37169d837766 (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.cpp68
-rw-r--r--source/slang/slang-workspace-version.cpp32
-rw-r--r--source/slang/slang-workspace-version.h8
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);
};