private static void EnsureDocumentationDictionaries() { if (_packageProgramDocumentations != null) { return; } lock (LockObject) { if (_packageProgramDocumentations != null) { return; } var folder = Path.GetDirectoryName(new Uri(typeof(OracleHelpProvider).Assembly.CodeBase).LocalPath); using (var reader = XmlReader.Create(Path.Combine(folder, "OracleDocumentation.xml"))) { var documentation = (Documentation) new XmlSerializer(typeof(Documentation)).Deserialize(reader); _sqlFunctionDocumentation = documentation.Functions.ToLookup(f => f.Name.ToQuotedIdentifier()); _statementDocumentation = documentation.Statements.ToLookup(s => s.Name); var dataDictionaryObjects = documentation.DataDictionary.ToDictionary(o => OracleObjectIdentifier.Create(OracleObjectIdentifier.SchemaSys, o.Name)); _dataDictionaryObjects = dataDictionaryObjects.AsReadOnly(); var packageProgramDocumentations = new Dictionary <OracleProgramIdentifier, DocumentationPackageSubProgram>(); foreach (var packageDocumentation in documentation.Packages) { var packageIdentifier = OracleObjectIdentifier.Create(OracleObjectIdentifier.SchemaSys, packageDocumentation.Name); var dataDictionaryObjectDocumentation = new DocumentationDataDictionaryObject { Name = packageDocumentation.Name, Value = packageDocumentation.Description, Url = packageDocumentation.Url }; dataDictionaryObjects.Add(packageIdentifier, dataDictionaryObjectDocumentation); if (packageDocumentation.SubPrograms == null) { continue; } foreach (var subProgramDocumentation in packageDocumentation.SubPrograms) { subProgramDocumentation.PackageDocumentation = packageDocumentation; packageProgramDocumentations[OracleProgramIdentifier.CreateFromValues(OracleObjectIdentifier.SchemaSys, packageDocumentation.Name, subProgramDocumentation.Name)] = subProgramDocumentation; } } _packageProgramDocumentations = packageProgramDocumentations.AsReadOnly(); } } }
public void ShowHelp(ActionExecutionContext executionContext) { var statement = executionContext.DocumentRepository.Statements.GetStatementAtPosition(executionContext.CaretOffset); if (statement == null) { return; } var semanticModel = (OracleStatementSemanticModel)executionContext.DocumentRepository.ValidationModels[statement].SemanticModel; var terminal = statement.GetTerminalAtPosition(executionContext.CaretOffset, n => !String.Equals(n.Id, Terminals.Comma) && !String.Equals(n.Id, Terminals.Dot) && !String.Equals(n.Id, Terminals.RightParenthesis) && !String.Equals(n.Id, Terminals.LeftParenthesis)); if (terminal == null) { return; } EnsureDocumentationDictionaries(); var programReference = semanticModel.GetProgramReference(terminal); if (programReference?.Metadata != null && programReference.Metadata.Type != ProgramType.StatementFunction) { ShowSqlFunctionDocumentation(programReference.Metadata.Identifier); return; } var objectReference = semanticModel.GetReference <OracleReference>(terminal); if (objectReference != null) { var targetObject = objectReference.SchemaObject.GetTargetSchemaObject(); DocumentationDataDictionaryObject dataDictionaryObject = null; var dataDictionaryObjectDocumentationFound = targetObject != null && _dataDictionaryObjects.TryGetValue(targetObject.FullyQualifiedName, out dataDictionaryObject); if (dataDictionaryObjectDocumentationFound) { Process.Start(dataDictionaryObject.Url); } } var firstFourTerminals = terminal.RootNode.Terminals.Where(t => t.IsRequiredIncludingParent).Take(4).ToList(); if (!terminal.Id.IsIdentifierOrAlias() && firstFourTerminals.IndexOf(terminal) != -1) { for (var i = 4; i > 0; i--) { var statementDocumentationKey = String.Join(" ", firstFourTerminals.Take(i).Select(t => ((OracleToken)t.Token).UpperInvariantValue)); foreach (var documentation in _statementDocumentation[statementDocumentationKey]) { Process.Start(documentation.Url); return; } } } }
private static void EnsureDocumentationDictionaries() { if (_packageProgramDocumentations != null) { return; } lock (LockObject) { if (_packageProgramDocumentations != null) { return; } var folder = new Uri(Path.GetDirectoryName(typeof (OracleHelpProvider).Assembly.CodeBase)).LocalPath; using (var reader = XmlReader.Create(Path.Combine(folder, "OracleDocumentation.xml"))) { var documentation = (Documentation)new XmlSerializer(typeof(Documentation)).Deserialize(reader); _sqlFunctionDocumentation = documentation.Functions.ToLookup(f => f.Name.ToQuotedIdentifier()); _statementDocumentation = documentation.Statements.ToLookup(s => s.Name); var dataDictionaryObjects = documentation.DataDictionary.ToDictionary(o => OracleObjectIdentifier.Create(OracleObjectIdentifier.SchemaSys, o.Name)); _dataDictionaryObjects = dataDictionaryObjects.AsReadOnly(); var packageProgramDocumentations = new Dictionary<OracleProgramIdentifier, DocumentationPackageSubProgram>(); foreach (var packageDocumentation in documentation.Packages) { var packageIdentifier = OracleObjectIdentifier.Create(OracleObjectIdentifier.SchemaSys, packageDocumentation.Name); var dataDictionaryObjectDocumentation = new DocumentationDataDictionaryObject { Name = packageDocumentation.Name, Value = packageDocumentation.Description, Url = packageDocumentation.Url }; dataDictionaryObjects.Add(packageIdentifier, dataDictionaryObjectDocumentation); if (packageDocumentation.SubPrograms == null) { continue; } foreach (var subProgramDocumentation in packageDocumentation.SubPrograms) { subProgramDocumentation.PackageDocumentation = packageDocumentation; packageProgramDocumentations[OracleProgramIdentifier.CreateFromValues(OracleObjectIdentifier.SchemaSys, packageDocumentation.Name, subProgramDocumentation.Name)] = subProgramDocumentation; } } _packageProgramDocumentations = packageProgramDocumentations.AsReadOnly(); } } }