public void Init() { // Create and mount database file system var objDatabase = ObjectDatabase.CreateDefaultDatabase(); var databaseFileProvider = new DatabaseFileProvider(objDatabase); AssetManager.GetFileProvider = () => databaseFileProvider; shaderMixinParser = new ShaderMixinParser(AssetManager.FileProvider); shaderMixinParser.SourceManager.LookupDirectoryList.Add("/shaders"); }
private ShaderMixinParser GetMixinParser() { lock (shaderMixinParserLock) { // Generate the AST from the mixin description if (shaderMixinParser == null) { shaderMixinParser = new ShaderMixinParser(FileProvider ?? AssetManager.FileProvider); shaderMixinParser.SourceManager.LookupDirectoryList.AddRange(SourceDirectories); // TODO: temp shaderMixinParser.SourceManager.UseFileSystem = UseFileSystem; shaderMixinParser.SourceManager.UrlToFilePath = UrlToFilePath; // TODO: temp } return shaderMixinParser; } }
private void AnalyzeAndGoToDefinition(string shaderSource, SiliconStudio.Shaders.Ast.SourceLocation location, List <string> shaderDirectories, ShaderNavigationResult result) { var mixer = new ShaderMixinParser(); mixer.SourceManager.UseFileSystem = true; mixer.AllowNonInstantiatedGenerics = true; mixer.SourceManager.LookupDirectoryList.AddRange(shaderDirectories); var shaderSourceName = Path.GetFileNameWithoutExtension(location.FileSource); mixer.SourceManager.AddShaderSource(shaderSourceName, shaderSource, location.FileSource); var mixinSource = new ShaderMixinSource(); mixinSource.Mixins.Add(new ShaderClassSource(shaderSourceName)); ShaderMixinParsingResult parsingResult; HashSet <ModuleMixinInfo> moduleMixins; var mixerResult = mixer.ParseAndAnalyze(mixinSource, null, out parsingResult, out moduleMixins); // Copy shader analysis to result parsingResult.CopyTo(result.Messages); if (mixerResult == null) { return; } var mixin = mixerResult.MixinInfos.FirstOrDefault(item => item.MixinName == shaderSourceName); if (mixin == null) { result.Messages.Error(ErrorMixinNotFound, GetSpan(location), shaderSourceName); return; } // If first line, first column, this is not a go to definition but only parsing request, so return directly if (location.Line == 1 && location.Column == 1) { return; } // var ast = mixin.MixinAst; var parsingInfo = mixin.Mixin.ParsingInfo; var pools = new List <ReferencesPool> { parsingInfo.ClassReferences, parsingInfo.StaticReferences, parsingInfo.ExternReferences, parsingInfo.StageInitReferences, }; foreach (var pool in pools) { var span = Find(pool, location); if (span.HasValue) { result.DefinitionLocation = span.Value; return; } } // Else Try to find from remaining navigable nodes foreach (var node in parsingInfo.NavigableNodes) { if (IsExpressionMatching(node, location)) { var typeReferencer = node as ITypeInferencer; if (typeReferencer != null && typeReferencer.TypeInference != null && typeReferencer.TypeInference.Declaration != null) { var declarationNode = (Node)typeReferencer.TypeInference.Declaration; result.DefinitionLocation = declarationNode.Span; break; } } } }
private void AnalyzeAndGoToDefinition(string shaderSource, SiliconStudio.Shaders.Ast.SourceLocation location, List<string> shaderDirectories, ShaderNavigationResult result) { // We are not using the storage when loading shaders from VS but directly the filesystem var mixer = new ShaderMixinParser(null); mixer.SourceManager.UseFileSystem = true; mixer.AllowNonInstantiatedGenerics = true; mixer.SourceManager.LookupDirectoryList.AddRange(shaderDirectories); var shaderSourceName = Path.GetFileNameWithoutExtension(location.FileSource); mixer.SourceManager.AddShaderSource(shaderSourceName, shaderSource, location.FileSource); var mixinSource = new ShaderMixinSource(); mixinSource.Mixins.Add(new ShaderClassSource(shaderSourceName)); ShaderMixinParsingResult parsingResult; HashSet<ModuleMixinInfo> moduleMixins; var mixerResult = mixer.ParseAndAnalyze(mixinSource, null, out parsingResult, out moduleMixins); // Copy shader analysis to result parsingResult.CopyTo(result.Messages); if (mixerResult == null) { return; } var mixin = mixerResult.MixinInfos.FirstOrDefault(item => item.MixinName == shaderSourceName); if (mixin == null) { result.Messages.Error(ErrorMixinNotFound, GetSpan(location), shaderSourceName); return; } // If first line, first column, this is not a go to definition but only parsing request, so return directly if (location.Line == 1 && location.Column == 1) { return; } // var ast = mixin.MixinAst; var parsingInfo = mixin.Mixin.ParsingInfo; var pools = new List<ReferencesPool> { parsingInfo.ClassReferences, parsingInfo.StaticReferences, parsingInfo.ExternReferences, parsingInfo.StageInitReferences, }; foreach (var pool in pools) { var span = Find(pool, location); if (span.HasValue) { result.DefinitionLocation = span.Value; return; } } // Else Try to find from remaining navigable nodes foreach (var node in parsingInfo.NavigableNodes) { if (IsExpressionMatching(node, location)) { var typeReferencer = node as ITypeInferencer; if (typeReferencer != null && typeReferencer.TypeInference != null && typeReferencer.TypeInference.Declaration != null) { var declarationNode = (Node)typeReferencer.TypeInference.Declaration; result.DefinitionLocation = declarationNode.Span; break; } } } }