Exemple #1
0
        private SqlDocumentRepository ConfigureDocumentRepository()
        {
            var documentRepository = new SqlDocumentRepository(_infrastructureFactory.CreateParser(), _infrastructureFactory.CreateStatementValidator(), _infrastructureFactory.CreateDatabaseModel(ConfigurationProvider.ConnectionStrings[0], "Test database model"));

            documentRepository.UpdateStatements(_editor.Text);
            return(documentRepository);
        }
Exemple #2
0
        internal ICollection <ContextAction> GetContextActions(OracleDatabaseModelBase databaseModel, string statementText, int cursorPosition)
        {
            var documentStore    = new SqlDocumentRepository(OracleSqlParser.Instance, new OracleStatementValidator(), databaseModel, statementText);
            var executionContext = new ActionExecutionContext(statementText, cursorPosition, cursorPosition, 0, documentStore);

            return(GetContextActions(documentStore, executionContext));
        }
Exemple #3
0
		public void Initialize(IInfrastructureFactory infrastructureFactory, IDatabaseModel databaseModel)
		{
			_helpProvider = infrastructureFactory.CreateHelpProvider();
			_codeCompletionProvider = infrastructureFactory.CreateCodeCompletionProvider();
			_navigationService = infrastructureFactory.CreateNavigationService();
			_colorizingTransformer.SetParser(infrastructureFactory.CreateParser());
			DocumentRepository = new SqlDocumentRepository(infrastructureFactory.CreateParser(), infrastructureFactory.CreateStatementValidator(), databaseModel);
		}
 public ActionExecutionContext(string statementText, int caretOffset, int selectionStart, int selectionLength, SqlDocumentRepository documentRepository)
 {
     StatementText      = statementText;
     SelectedSegments   = new[] { SourcePosition.Create(selectionStart, selectionLength) };
     SelectionStart     = selectionStart;
     SelectionLength    = selectionLength;
     CaretOffset        = caretOffset;
     DocumentRepository = documentRepository;
 }
Exemple #5
0
		public ActionExecutionContext(string statementText, int caretOffset, int selectionStart, int selectionLength, SqlDocumentRepository documentRepository)
		{
			StatementText = statementText;
			SelectedSegments = new[] { SourcePosition.Create(selectionStart, selectionLength) };
			SelectionStart = selectionStart;
			SelectionLength = selectionLength;
			CaretOffset = caretOffset;
			DocumentRepository = documentRepository;
		}
 public DocumentService(
     AzureBlobStorage blobStorage,
     SqlDocumentRepository documentRepository,
     Settings settings)
 {
     _blobStorage        = blobStorage;
     _documentRepository = documentRepository;
     _settings           = settings;
 }
 public static ActionExecutionContext Create(TextEditor editor, SqlDocumentRepository documentRepository)
 {
     return
         (new ActionExecutionContext(editor.Text, editor.CaretOffset, editor.SelectionStart, editor.SelectionLength, documentRepository)
     {
         SelectedSegments = editor.TextArea.Selection.Segments
                            .Select(s => SourcePosition.Create(s.StartOffset, s.EndOffset - 1))
                            .ToArray()
     });
 }
Exemple #8
0
		public static ActionExecutionContext Create(TextEditor editor, SqlDocumentRepository documentRepository)
		{
			return
				new ActionExecutionContext(editor.Text, editor.CaretOffset, editor.SelectionStart, editor.SelectionLength, documentRepository)
				{
					SelectedSegments = editor.TextArea.Selection.Segments
						.Select(s => SourcePosition.Create(s.StartOffset, s.EndOffset - 1))
						.ToArray()
				};
		}
        public void TestNavigateToColumnDefinitionWhenDatabaseModelNotLoaded()
        {
            const string query = "SELECT P.PROJECT_ID, P.NAME FROM (SELECT * FROM PROJECT) P";

            var databaseModel = new OracleTestDatabaseModel();

            databaseModel.AllObjects.Clear();
            var documentRepository = new SqlDocumentRepository(OracleSqlParser.Instance, new OracleStatementValidator(), databaseModel);

            documentRepository.UpdateStatements(query);

            const int caretOffset      = 13;
            var       executionContext = new ActionExecutionContext(query, caretOffset, caretOffset, caretOffset, documentRepository);
            var       targetIndex      = _navigationService.NavigateToDefinition(executionContext);

            targetIndex.ShouldBe(null);
        }
Exemple #10
0
        public static void ExecuteEditCommand(SqlDocumentRepository documentRepository, SqlTextEditor editor, Action <ActionExecutionContext> executionHandler)
        {
            if (editor.IsReadOnly || !String.Equals(documentRepository.StatementText, editor.Text))
            {
                return;
            }

            var executionContext = ActionExecutionContext.Create(editor, documentRepository);

            try
            {
                executionHandler(executionContext);
                UpdateDocument(editor, executionContext);
            }
            catch (Exception exception)
            {
                App.LogErrorAndShowMessage(exception);
            }
        }
Exemple #11
0
        public IEnumerable <ICodeSnippet> GetSnippets(SqlDocumentRepository sqlDocumentRepository, string statementText, int cursorPosition)
        {
            if (sqlDocumentRepository?.Statements == null)
            {
                return(EmptyCollection);
            }

            var statement = sqlDocumentRepository.Statements.TakeWhile(s => s.SourcePosition.IndexStart <= cursorPosition - 1).LastOrDefault();

            StatementGrammarNode currentNode = null;

            if (statement != null)
            {
                currentNode =
                    statement.GetTerminalAtPosition(cursorPosition)
                    ?? statement.GetNearestTerminalToPosition(cursorPosition);
            }

            if (currentNode != null &&
                String.Equals(currentNode.Id, OracleGrammarDescription.Terminals.RightParenthesis) &&
                !String.Equals(currentNode.ParentNode.Id, OracleGrammarDescription.NonTerminals.CommonTableExpression) &&
                currentNode.PrecedingTerminal?.PrecedingTerminal != null)
            {
                currentNode = currentNode.PrecedingTerminal.PrecedingTerminal;
            }

            var textToReplace = new String(statementText.Substring(0, cursorPosition).Reverse().TakeWhile(c => !c.In(' ', '\n', '\t', '(', '\r', ';')).Reverse().ToArray());

            if (String.IsNullOrWhiteSpace(textToReplace))
            {
                return(EmptyCollection);
            }

            var candidates = OracleSqlParser.Instance.GetTerminalCandidates(currentNode).Select(c => c.Id);

            return(Snippets.SnippetCollection.Where(s => s.Name.ToUpperInvariant().Contains(textToReplace.ToUpperInvariant()) &&
                                                    (s.AllowedTerminals == null || s.AllowedTerminals.Length == 0 || s.AllowedTerminals.Select(t => t.Id).Intersect(candidates).Any()))
                   .Select(s => BuildCodeSnippet(s, SourcePosition.Create(cursorPosition - textToReplace.Length, cursorPosition))).ToArray());
        }
Exemple #12
0
		public IEnumerable<ICodeSnippet> GetSnippets(SqlDocumentRepository sqlDocumentRepository, string statementText, int cursorPosition)
		{
			if (sqlDocumentRepository?.Statements == null)
			{
				return EmptyCollection;
			}

			var statement = sqlDocumentRepository.Statements.TakeWhile(s => s.SourcePosition.IndexStart <= cursorPosition - 1).LastOrDefault();

			StatementGrammarNode currentNode = null;
			if (statement != null)
			{
				currentNode =
					statement.GetTerminalAtPosition(cursorPosition)
					?? statement.GetNearestTerminalToPosition(cursorPosition);
			}

			if (currentNode != null &&
				String.Equals(currentNode.Id, OracleGrammarDescription.Terminals.RightParenthesis) &&
				!String.Equals(currentNode.ParentNode.Id, OracleGrammarDescription.NonTerminals.CommonTableExpression) &&
				currentNode.PrecedingTerminal?.PrecedingTerminal != null)
			{
				currentNode = currentNode.PrecedingTerminal.PrecedingTerminal;
			}

			var textToReplace = new String(statementText.Substring(0, cursorPosition).Reverse().TakeWhile(c => !c.In(' ', '\n', '\t', '(', '\r', ';')).Reverse().ToArray());

			if (String.IsNullOrWhiteSpace(textToReplace))
			{
				return EmptyCollection;
			}

			var candidates = OracleSqlParser.Instance.GetTerminalCandidates(currentNode).Select(c => c.Id);

			return Snippets.SnippetCollection.Where(s => s.Name.ToUpperInvariant().Contains(textToReplace.ToUpperInvariant()) &&
														 (s.AllowedTerminals == null || s.AllowedTerminals.Length == 0 || s.AllowedTerminals.Select(t => t.Id).Intersect(candidates).Any()))
				.Select(s => BuildCodeSnippet(s, SourcePosition.Create(cursorPosition - textToReplace.Length, cursorPosition))).ToArray();
		}
Exemple #13
0
		public ICollection<ProgramOverloadDescription> ResolveProgramOverloads(SqlDocumentRepository documentRepository, int cursorPosition)
		{
			var emptyCollection = new ProgramOverloadDescription[0];
			var node = documentRepository.Statements.GetNodeAtPosition(cursorPosition);
			if (node == null)
			{
				return emptyCollection;
			}

			var semanticModel = (OracleStatementSemanticModel)documentRepository.ValidationModels[node.Statement].SemanticModel;
			var referenceContainers = semanticModel.AllReferenceContainers;
			var programOverloadSource = ResolveProgramOverloads(referenceContainers, node, cursorPosition);

			var programOverloads = programOverloadSource
				.Select(
					o =>
					{
						var metadata = o.ProgramMetadata;
						var returnParameter = metadata.ReturnParameter;
						var parameters = metadata.Parameters
							.Where(p => p.Direction != ParameterDirection.ReturnValue && p.DataLevel == 0)
							.Select(BuildParameterLabel)
							.ToArray();

						return
							new ProgramOverloadDescription
							{
								Name = metadata.Identifier.FullyQualifiedIdentifier,
								Parameters = parameters,
								CurrentParameterIndex = o.CurrentParameterIndex,
								ReturnedDatatype = returnParameter?.FullDataTypeName
							};
					});
			
			return programOverloads.ToArray();
		}
Exemple #14
0
		public ICollection<ICodeCompletionItem> ResolveItems(SqlDocumentRepository sqlDocumentRepository, IDatabaseModel databaseModel, int cursorPosition, bool forcedInvokation)
		{
			if (sqlDocumentRepository?.Statements == null)
			{
				return EmptyCollection;
			}

			var completionType = new OracleCodeCompletionType(sqlDocumentRepository, sqlDocumentRepository.StatementText, cursorPosition);
			//completionType.PrintResults();

			if (completionType.InComment)
			{
				return EmptyCollection;
			}

			if (!forcedInvokation && !completionType.JoinCondition && String.IsNullOrEmpty(completionType.TerminalValuePartUntilCaret) && !completionType.IsCursorTouchingIdentifier)
			{
				return EmptyCollection;
			}

			StatementGrammarNode currentTerminal;

			var completionItems = Enumerable.Empty<ICodeCompletionItem>();
			var statement = (OracleStatement)sqlDocumentRepository.Statements.LastOrDefault(s => s.GetNodeAtPosition(cursorPosition) != null);

			if (statement == null)
			{
				statement = completionType.Statement;
				if (statement == null)
				{
					return EmptyCollection;
				}

				currentTerminal = statement.GetNearestTerminalToPosition(cursorPosition);

				if (completionType.InUnparsedData || currentTerminal == null)
				{
					return EmptyCollection;
				}
			}
			else
			{
				currentTerminal = statement.GetNodeAtPosition(cursorPosition);
				if (currentTerminal.Type == NodeType.NonTerminal)
				{
					currentTerminal = statement.GetNearestTerminalToPosition(cursorPosition);
				}
				else if (currentTerminal.Id.In(Terminals.RightParenthesis, Terminals.Comma, Terminals.Semicolon))
				{
					var precedingNode = statement.GetNearestTerminalToPosition(cursorPosition - 1);
					if (precedingNode != null)
					{
						currentTerminal = precedingNode;
					}
				}
			}

			var oracleDatabaseModel = (OracleDatabaseModelBase)databaseModel;
			var semanticModel = (OracleStatementSemanticModel)sqlDocumentRepository.ValidationModels[statement].SemanticModel;

			var cursorAtLastTerminal = cursorPosition <= currentTerminal.SourcePosition.IndexEnd + 1;
			var terminalToReplace = completionType.ReferenceIdentifier.IdentifierUnderCursor;

			var referenceContainers = GetReferenceContainers(semanticModel.MainObjectReferenceContainer, completionType.CurrentQueryBlock);

			var extraOffset = currentTerminal.SourcePosition.ContainsIndex(cursorPosition) && !currentTerminal.Id.In(Terminals.LeftParenthesis, Terminals.Dot) ? 1 : 0;

			if (completionType.SchemaDataObject)
			{
				var schemaName = completionType.ReferenceIdentifier.HasSchemaIdentifier
					? currentTerminal.ParentNode.FirstTerminalNode.Token.Value
					: databaseModel.CurrentSchema.ToQuotedIdentifier();

				completionItems = completionItems.Concat(GenerateSchemaDataObjectItems(oracleDatabaseModel, schemaName, completionType.TerminalValuePartUntilCaret, terminalToReplace, insertOffset: extraOffset));

				if (!completionType.ReferenceIdentifier.HasSchemaIdentifier)
				{
					completionItems = completionItems.Concat(GenerateSchemaDataObjectItems(oracleDatabaseModel, OracleObjectIdentifier.SchemaPublic, completionType.TerminalValuePartUntilCaret, terminalToReplace, insertOffset: extraOffset));
				}

				completionItems = completionItems.Concat(GenerateCommonTableExpressionReferenceItems(semanticModel, completionType.TerminalValuePartUntilCaret, terminalToReplace, extraOffset));
			}

			var joinClauseNode = currentTerminal.GetPathFilterAncestor(n => !String.Equals(n.Id, NonTerminals.FromClause), NonTerminals.JoinClause);
			if (joinClauseNode != null && !cursorAtLastTerminal && currentTerminal.Id.In(Terminals.ObjectIdentifier, Terminals.ObjectAlias, Terminals.On))
			{
				var isNotInnerJoin = joinClauseNode.ChildNodes.SingleOrDefault(n => String.Equals(n.Id, NonTerminals.InnerJoinClause)) == null;
				if (isNotInnerJoin || (!joinClauseNode.FirstTerminalNode.Id.In(Terminals.Cross, Terminals.Natural)))
				{
					var joinedTableReferenceNodes = joinClauseNode.GetPathFilterDescendants(n => !n.Id.In(NonTerminals.JoinClause, NonTerminals.NestedQuery), NonTerminals.TableReference).ToArray();
					if (joinedTableReferenceNodes.Length == 1)
					{
						var joinedTableReference = completionType.CurrentQueryBlock.ObjectReferences.SingleOrDefault(t => t.RootNode == joinedTableReferenceNodes[0]);
						if (joinedTableReference != null && (joinedTableReference.Type != ReferenceType.InlineView || joinedTableReference.AliasNode != null))
						{
							foreach (var parentTableReference in completionType.CurrentQueryBlock.ObjectReferences
								.Where(t => t.RootNode.SourcePosition.IndexStart < joinedTableReference.RootNode.SourcePosition.IndexStart &&
								            (t.Type != ReferenceType.InlineView || t.AliasNode != null)))
							{
								var joinSuggestions = GenerateJoinConditionSuggestionItems(parentTableReference, joinedTableReference, completionType, extraOffset);
								completionItems = completionItems.Concat(joinSuggestions);
							}
						}
					}
				}
			}

			if (completionType.JoinType)
			{
				completionItems = completionItems.Concat(CreateJoinTypeCompletionItems(completionType));
			}

			if (String.Equals(currentTerminal.Id, Terminals.Join) ||
				(String.Equals(currentTerminal.Id, Terminals.ObjectAlias) && String.Equals(((OracleToken)currentTerminal.Token).UpperInvariantValue, TerminalValues.Join)))
			{
				completionItems = completionItems.Concat(GenerateSchemaDataObjectItems(oracleDatabaseModel, databaseModel.CurrentSchema.ToQuotedIdentifier(), null, null, insertOffset: extraOffset));
				completionItems = completionItems.Concat(GenerateSchemaDataObjectItems(oracleDatabaseModel, OracleObjectIdentifier.SchemaPublic, null, null, insertOffset: extraOffset));
				completionItems = completionItems.Concat(GenerateCommonTableExpressionReferenceItems(semanticModel, null, null, extraOffset));
			}

			if (completionType.Column || completionType.PlSqlCompletion != PlSqlCompletion.None)
			{
				completionItems = completionItems.Concat(GenerateSelectListItems(referenceContainers, cursorPosition, oracleDatabaseModel, completionType, forcedInvokation));
			}

			if (completionType.Column || completionType.SpecialFunctionParameter)
			{
				var programOverloads = ResolveProgramOverloads(referenceContainers, currentTerminal, cursorPosition);
				var specificFunctionParameterCodeCompletionItems = CodeCompletionSearchHelper.ResolveSpecificFunctionParameterCodeCompletionItems(currentTerminal, programOverloads, oracleDatabaseModel);
				completionItems = completionItems.Concat(specificFunctionParameterCodeCompletionItems);
			}

			if (completionType.ColumnAlias)
			{
				completionItems = completionItems.Concat(GenerateColumnAliases(terminalToReplace, completionType));
			}

			if (completionType.UpdateSetColumn && semanticModel.MainObjectReferenceContainer.MainObjectReference != null)
			{
				completionItems = completionItems.Concat(GenerateSimpleColumnItems(semanticModel.MainObjectReferenceContainer.MainObjectReference, completionType));
			}

			if (completionType.InsertIntoColumn)
			{
				var columnList = currentTerminal.GetAncestor(NonTerminals.ParenthesisEnclosedPrefixedIdentifierList);
				var insertTarget = semanticModel.InsertTargets.SingleOrDefault(t => t.ColumnListNode == columnList && t.DataObjectReference != null);
				if (insertTarget != null)
				{
					completionItems = completionItems.Concat(GenerateSimpleColumnItems(insertTarget.DataObjectReference, completionType));
				}
			}

			if (completionType.DatabaseLink)
			{
				var databaseLinkItems = oracleDatabaseModel.DatabaseLinks.Values
					.Where(
						l =>
							l.FullyQualifiedName.NormalizedOwner.In(OracleObjectIdentifier.SchemaPublic, oracleDatabaseModel.CurrentSchema.ToQuotedIdentifier()) &&
							(String.IsNullOrEmpty(completionType.TerminalValueUnderCursor) || !String.Equals(completionType.TerminalValueUnderCursor.ToQuotedIdentifier(), l.FullyQualifiedName.NormalizedName)) &&
							CodeCompletionSearchHelper.IsMatch(l.FullyQualifiedName.Name, completionType.TerminalValuePartUntilCaret))
					.Select(
						l =>
							new OracleCodeCompletionItem
							{
								Name = l.FullyQualifiedName.Name.ToSimpleIdentifier(),
								Text = l.FullyQualifiedName.Name.ToSimpleIdentifier(),
								Category = OracleCodeCompletionCategory.DatabaseLink,
								StatementNode = completionType.CurrentTerminal
							});

				completionItems = completionItems.Concat(databaseLinkItems);
			}

			if (completionType.ExplicitPartition || completionType.ExplicitSubPartition)
			{
				var tableReferenceNode = completionType.EffectiveTerminal.GetAncestor(NonTerminals.TableReference);
				var tableReference = referenceContainers.SelectMany(c => c.ObjectReferences).SingleOrDefault(o => o.RootNode == tableReferenceNode && o.SchemaObject != null);
				if (tableReference != null)
				{
					completionItems = completionItems.Concat(GenerateTablePartitionItems(tableReference, completionType, completionType.ExplicitSubPartition));
				}
			}

			if (completionType.DataType)
			{
				completionItems = completionItems.Concat(GenerateDataTypeItems(completionType, oracleDatabaseModel));
			}

			if (completionType.Schema && !completionType.UpdateSetColumn &&
				(!completionType.ReferenceIdentifier.HasSchemaIdentifier || String.Equals(completionType.EffectiveTerminal.Id, Terminals.SchemaIdentifier)))
			{
				completionItems = completionItems.Concat(GenerateSchemaItems(completionType, terminalToReplace, extraOffset, oracleDatabaseModel, 2));
			}

			if (completionType.BindVariable)
			{
				var providerConfiguration = WorkDocumentCollection.GetProviderConfiguration(oracleDatabaseModel.ConnectionString.ProviderName);
				var currentNormalizedValue = completionType.TerminalValuePartUntilCaret.ToQuotedIdentifier();
				var bindVariables =
					providerConfiguration.BindVariables.Where(bv => bv.Value != null && !Equals(bv.Value, String.Empty) && !Equals(bv.Value, DateTime.MinValue) && !String.Equals(bv.Name.ToQuotedIdentifier(), currentNormalizedValue) && CodeCompletionSearchHelper.IsMatch(bv.Name.ToQuotedIdentifier(), completionType.TerminalValuePartUntilCaret))
						.Select(
							bv =>
								new OracleCodeCompletionItem
								{
									Name = bv.Name,
									Text = bv.Name,
									Category = OracleCodeCompletionCategory.BindVariable,
									StatementNode = completionType.ReferenceIdentifier.IdentifierUnderCursor
								});

				completionItems = completionItems.Concat(bindVariables);
			}

			completionItems = completionItems.Concat(GenerateKeywordItems(completionType));

			return completionItems.OrderItems().ToArray();

			// TODO: Add option to search all/current/public schemas
		}
Exemple #15
0
		internal ICollection<ICodeCompletionItem> ResolveItems(IDatabaseModel databaseModel, string statementText, int cursorPosition, bool forcedInvokation = true, params string[] categories)
		{
			var documentStore = new SqlDocumentRepository(OracleSqlParser.Instance, new OracleStatementValidator(), databaseModel, statementText);
			var sourceItems = ResolveItems(documentStore, databaseModel, cursorPosition, forcedInvokation);
			return sourceItems.Where(i => categories.Length == 0 || categories.Contains(i.Category)).ToArray();
		}
Exemple #16
0
 public ICollection <ContextAction> GetAvailableRefactorings(SqlDocumentRepository sqlDocumentRepository, ActionExecutionContext executionContext)
 {
     throw new NotImplementedException();
 }
Exemple #17
0
        public ICollection <ContextAction> GetContextActions(SqlDocumentRepository sqlDocumentRepository, ActionExecutionContext executionContext)
        {
            if (sqlDocumentRepository?.Statements == null || executionContext.StatementText != sqlDocumentRepository.StatementText)
            {
                return(EmptyCollection);
            }

            var currentTerminal = sqlDocumentRepository.Statements.GetTerminalAtPosition(executionContext.CaretOffset);

            if (currentTerminal == null)
            {
                return(EmptyCollection);
            }

            var precedingTerminal = currentTerminal.PrecedingTerminal;

            if (currentTerminal.SourcePosition.IndexStart == executionContext.CaretOffset && precedingTerminal != null && precedingTerminal.SourcePosition.IndexEnd + 1 == executionContext.CaretOffset &&
                currentTerminal.Id.In(Terminals.Comma, Terminals.LeftParenthesis, Terminals.RightParenthesis))
            {
                currentTerminal = precedingTerminal;
            }

            var semanticModel = (OracleStatementSemanticModel)sqlDocumentRepository.ValidationModels[currentTerminal.Statement].SemanticModel;

            var settings = new CommandSettingsModel {
                Value = "Enter value"
            };

            executionContext.SettingsProvider = _commandSettingsProviderFactory.CreateCommandSettingsProvider(settings);

            var actionList = new List <ContextAction>();

            if (OracleCommands.AddAlias.CanExecuteHandler(executionContext))
            {
                actionList.Add(new ContextAction(AddAliasCommand.Title, OracleCommands.AddAlias, executionContext));
            }

            if (OracleCommands.WrapAsInlineView.CanExecuteHandler(executionContext))
            {
                actionList.Add(new ContextAction(WrapAsInlineViewCommand.Title, OracleCommands.WrapAsInlineView, executionContext));
            }

            if (OracleCommands.WrapAsCommonTableExpression.CanExecuteHandler(executionContext))
            {
                actionList.Add(new ContextAction(WrapAsCommonTableExpressionCommand.Title, OracleCommands.WrapAsCommonTableExpression, executionContext));
            }

            if (OracleCommands.ToggleQuotedNotation.CanExecuteHandler(executionContext))
            {
                actionList.Add(new ContextAction(ToggleQuotedNotationCommand.Title, OracleCommands.ToggleQuotedNotation, executionContext));
            }

            if (OracleCommands.AddToGroupByClause.CanExecuteHandler(executionContext))
            {
                actionList.Add(new ContextAction(AddToGroupByCommand.Title, OracleCommands.AddToGroupByClause, executionContext));
            }

            if (OracleCommands.AddToOrderByClause.CanExecuteHandler(executionContext))
            {
                actionList.Add(new ContextAction(AddToOrderByCommand.Title, OracleCommands.AddToOrderByClause, executionContext));
            }

            var canExecuteResult = OracleCommands.ExpandAsterisk.CanExecuteHandler(executionContext);

            if (canExecuteResult)
            {
                actionList.Add(new ContextAction(ExpandAsteriskCommand.Title, OracleCommands.ExpandAsterisk, CloneContextWithUseDefaultSettingsOption(executionContext), canExecuteResult.IsLongOperation));
            }

            if (OracleCommands.UnnestInlineView.CanExecuteHandler(executionContext))
            {
                actionList.Add(new ContextAction(UnnestInlineViewCommand.Title, OracleCommands.UnnestInlineView, executionContext));
            }

            if (OracleCommands.ToggleFullyQualifiedReferences.CanExecuteHandler(executionContext))
            {
                actionList.Add(new ContextAction(ToggleFullyQualifiedReferencesCommand.Title, OracleCommands.ToggleFullyQualifiedReferences, executionContext));
            }

            if (OracleCommands.AddMissingColumn.CanExecuteHandler(executionContext))
            {
                actionList.Add(new ContextAction(AddMissingColumnCommand.Title, OracleCommands.AddMissingColumn, executionContext));
            }

            canExecuteResult = OracleCommands.CreateScript.CanExecuteHandler(executionContext);
            if (canExecuteResult)
            {
                actionList.Add(new ContextAction(CreateScriptCommand.Title, OracleCommands.CreateScript, CloneContextWithUseDefaultSettingsOption(executionContext), canExecuteResult.IsLongOperation));
            }

            if (OracleCommands.AddInsertIntoColumnList.CanExecuteHandler(executionContext))
            {
                actionList.Add(new ContextAction(AddInsertIntoColumnListCommand.Title, OracleCommands.AddInsertIntoColumnList, CloneContextWithUseDefaultSettingsOption(executionContext)));
            }

            if (OracleCommands.CleanRedundantSymbol.CanExecuteHandler(executionContext))
            {
                actionList.Add(new ContextAction(CleanRedundantSymbolCommand.Title, OracleCommands.CleanRedundantSymbol, executionContext));
            }

            if (OracleCommands.AddCreateTableAs.CanExecuteHandler(executionContext))
            {
                actionList.Add(new ContextAction(AddCreateTableAsCommand.Title, OracleCommands.AddCreateTableAs, executionContext));
            }

            if (OracleCommands.Unquote.CanExecuteHandler(executionContext))
            {
                actionList.Add(new ContextAction(UnquoteCommand.Title, OracleCommands.Unquote, executionContext));
            }

            if (OracleCommands.PropagateColumn.CanExecuteHandler(executionContext))
            {
                actionList.Add(new ContextAction(PropagateColumnCommand.Title, OracleCommands.PropagateColumn, executionContext));
            }

            if (OracleCommands.ConvertOrderByNumberColumnReferences.CanExecuteHandler(executionContext))
            {
                actionList.Add(new ContextAction(ConvertOrderByNumberColumnReferencesCommand.Title, OracleCommands.ConvertOrderByNumberColumnReferences, executionContext));
            }

            if (OracleCommands.GenerateCustomTypeCSharpWrapperClass.CanExecuteHandler(executionContext))
            {
                actionList.Add(new ContextAction(GenerateCustomTypeCSharpWrapperClassCommand.Title, OracleCommands.GenerateCustomTypeCSharpWrapperClass, executionContext));
            }

            if (OracleCommands.SplitString.CanExecuteHandler(executionContext))
            {
                actionList.Add(new ContextAction(SplitStringCommand.Title, OracleCommands.SplitString, executionContext));
            }

            if (OracleCommands.ExtractPackageInterface.CanExecuteHandler(executionContext))
            {
                actionList.Add(new ContextAction(ExtractPackageInterfaceCommand.Title, OracleCommands.ExtractPackageInterface, executionContext));
            }

            if (OracleCommands.ExpandView.CanExecuteHandler(executionContext))
            {
                actionList.Add(new ContextAction(ExpandViewCommand.Title, OracleCommands.ExpandView, executionContext, true));
            }

            if (OracleCommands.ConfigureNamedParameters.CanExecuteHandler(executionContext))
            {
                actionList.Add(new ContextAction(ConfigureNamedParameterCommand.Title, OracleCommands.ConfigureNamedParameters, CloneContextWithUseDefaultSettingsOption(executionContext)));
            }

            var actions =
                ResolveAmbiguousColumnCommand.ResolveCommandHandlers(semanticModel, currentTerminal)
                .Select(c => new ContextAction("Resolve as " + c.Name, c, executionContext));

            actionList.AddRange(actions);

            actions =
                BindVariableLiteralConversionCommand.ResolveCommandHandlers(semanticModel, currentTerminal)
                .Select(c => new ContextAction(c.Name, c, executionContext));

            actionList.AddRange(actions);

            actions =
                LiteralBindVariableConversionCommand.ResolveCommandHandlers(semanticModel, currentTerminal)
                .Select(c => new ContextAction(c.Name, c, executionContext));

            actionList.AddRange(actions);

            // TODO: Resolve command order
            return(actionList.AsReadOnly());
        }
Exemple #18
0
		public void TestToolTipBeforeDatabaseModelLoaded()
		{
			const string query = "SELECT S.* FROM SELECTION S";
			_documentRepository.UpdateStatements(query);

			var databaseModel = new OracleTestDatabaseModel();
			databaseModel.AllObjects.Clear();
			var documentStore = new SqlDocumentRepository(OracleSqlParser.Instance, new OracleStatementValidator(), databaseModel, query);
			var toolTip = _toolTipProvider.GetToolTip(documentStore, 7);

			toolTip.ShouldBe(null);
		}
Exemple #19
0
		internal IEnumerable<ICodeSnippet> GetSnippets(string statementText, int cursorPosition, IDatabaseModel databaseModel)
		{
			var documentStore = new SqlDocumentRepository(OracleSqlParser.Instance, new OracleStatementValidator(), databaseModel, statementText);
			return GetSnippets(documentStore, statementText, cursorPosition);
		}
Exemple #20
0
		public void SetUp()
		{
			_documentRepository = TestFixture.CreateDocumentRepository();
		}
Exemple #21
0
        internal IEnumerable <ICodeSnippet> GetSnippets(string statementText, int cursorPosition, IDatabaseModel databaseModel)
        {
            var documentStore = new SqlDocumentRepository(OracleSqlParser.Instance, new OracleStatementValidator(), databaseModel, statementText);

            return(GetSnippets(documentStore, statementText, cursorPosition));
        }
Exemple #22
0
 public IEnumerable <ICodeSnippet> GetCodeGenerationItems(SqlDocumentRepository sqlDocumentRepository)
 {
     return(Snippets.CodeGenerationItemCollection.Select(s => BuildCodeSnippet(s, SourcePosition.Empty))
            .OrderBy(s => s.Name));
 }
Exemple #23
0
        public OracleCodeCompletionType(SqlDocumentRepository documentRepository, string statementText, int cursorPosition)
        {
            CursorPosition = cursorPosition;

            Statement = (OracleStatement)(documentRepository.Statements.GetStatementAtPosition(cursorPosition) ?? documentRepository.Statements.LastOrDefault());
            if (Statement == null)
            {
                return;
            }

            if (Statement.TerminatorNode != null && Statement.TerminatorNode.SourcePosition.IndexStart < cursorPosition)
            {
                return;
            }

            var nearestTerminal = Statement.GetNearestTerminalToPosition(cursorPosition);

            if (nearestTerminal == null)
            {
                return;
            }

            var precedingTerminal = nearestTerminal.PrecedingTerminal;

            InComment = Statement.Comments.Any(c => c.SourcePosition.ContainsIndex(cursorPosition));

            if (!documentRepository.ValidationModels.TryGetValue(Statement, out IValidationModel validationModel))
            {
                return;
            }

            SemanticModel = (OracleStatementSemanticModel)validationModel.SemanticModel;

            var requiredOffsetAfterToken = nearestTerminal.Id.IsZeroOffsetTerminalId() ? 0 : 1;
            var isCursorAfterToken       = nearestTerminal.SourcePosition.IndexEnd + requiredOffsetAfterToken < cursorPosition;
            var atAdHocTemporaryTerminal = false;

            if (isCursorAfterToken)
            {
                var unparsedTextBetweenTokenAndCursor           = statementText.Substring(nearestTerminal.SourcePosition.IndexEnd + 1, cursorPosition - nearestTerminal.SourcePosition.IndexEnd - 1);
                var unparsedEndTrimmedTextBetweenTokenAndCursor = unparsedTextBetweenTokenAndCursor.TrimEnd();

                OracleToken[] extraUnparsedTokens;
                using (var tokenReader = OracleTokenReader.Create(unparsedEndTrimmedTextBetweenTokenAndCursor))
                {
                    extraUnparsedTokens = tokenReader.GetTokens(true).ToArray();
                }

                if (extraUnparsedTokens.Length > 0)
                {
                    TerminalCandidates = OracleSqlParser.Instance.GetTerminalCandidates(nearestTerminal);
                    if (TerminalCandidates.Count == 0 || extraUnparsedTokens.Length > 1 || unparsedEndTrimmedTextBetweenTokenAndCursor.Length < unparsedTextBetweenTokenAndCursor.Length)
                    {
                        InUnparsedData = true;
                        return;
                    }
                }

                TerminalValueUnderCursor = extraUnparsedTokens.FirstOrDefault().Value;

                if (TerminalValueUnderCursor != null)
                {
                    TerminalValuePartUntilCaret = TerminalValueUnderCursor;
                    precedingTerminal           = nearestTerminal;
                    nearestTerminal             = CurrentTerminal = new StatementGrammarNode(NodeType.Terminal, Statement, new OracleToken(TerminalValueUnderCursor, cursorPosition - TerminalValuePartUntilCaret.Length));
                    precedingTerminal.ParentNode.Clone().AddChildNodes(nearestTerminal);
                    atAdHocTemporaryTerminal = true;

                    nearestTerminal.Id = nearestTerminal.Token.Value[0] == '"'
                                                ? Terminals.Identifier
                                                : GetIdentifierCandidate();

                    if (nearestTerminal.Id != null)
                    {
                        ReferenceIdentifier = BuildReferenceIdentifier(nearestTerminal.ParentNode.GetDescendants(Terminals.SchemaIdentifier, Terminals.ObjectIdentifier, Terminals.Identifier).ToArray());
                    }

                    if (!String.IsNullOrEmpty(TerminalValueUnderCursor) && nearestTerminal.SourcePosition.ContainsIndex(cursorPosition))
                    {
                        isCursorAfterToken = false;
                    }

                    TerminalValueUnderCursor = TerminalValueUnderCursor.Trim('"');
                }
            }
            else
            {
                CurrentTerminal = nearestTerminal;
                ResolveCurrentTerminalValue(nearestTerminal);
            }

            var effectiveTerminal = Statement.GetNearestTerminalToPosition(cursorPosition, n => !n.Id.In(Terminals.LeftParenthesis, Terminals.RightParenthesis, Terminals.Comma, Terminals.Semicolon)) ?? nearestTerminal;

            CurrentQueryBlock = SemanticModel.GetQueryBlock(effectiveTerminal);

            AnalyzeObjectReferencePrefixes(effectiveTerminal);
            var isCursorAfterEffectiveTerminal = cursorPosition > effectiveTerminal.SourcePosition.IndexEnd + 1;

            if (precedingTerminal == null && nearestTerminal != Statement.RootNode.FirstTerminalNode)
            {
                precedingTerminal = nearestTerminal;
            }

            var isCursorTouchingTwoTerminals = nearestTerminal.SourcePosition.IndexStart == cursorPosition && precedingTerminal != null && precedingTerminal.SourcePosition.IndexEnd + 1 == cursorPosition;

            if (isCursorTouchingTwoTerminals && !String.Equals(nearestTerminal.Id, Terminals.Identifier))
            {
                IsCursorTouchingIdentifier = String.Equals(precedingTerminal.Id, Terminals.Identifier);
                EffectiveTerminal          = precedingTerminal;
            }
            else
            {
                EffectiveTerminal = nearestTerminal;
            }

            var isColon = String.Equals(EffectiveTerminal.Id, Terminals.Colon);

            if (!String.Equals(Statement.RootNode.Id, NonTerminals.CreatePlSqlStatement))
            {
                BindVariable  = isColon && (String.Equals(EffectiveTerminal.ParentNode.Id, NonTerminals.AssignmentTriggerReferenceTarget) || String.Equals(EffectiveTerminal.ParentNode.Id, NonTerminals.BindVariableExpression));
                BindVariable |= String.Equals(EffectiveTerminal.Id, Terminals.BindVariableIdentifier);
            }

            var terminalCandidateSourceToken = isCursorAfterToken || isColon ? nearestTerminal : precedingTerminal;

            if (nearestTerminal.Id.In(Terminals.RightParenthesis, Terminals.Comma, Terminals.Dot, Terminals.Semicolon) && isCursorTouchingTwoTerminals && precedingTerminal.Id.IsIdentifier())
            {
                terminalCandidateSourceToken = precedingTerminal.PrecedingTerminal;
                ResolveCurrentTerminalValue(precedingTerminal);
            }

            if (TerminalCandidates == null)
            {
                TerminalCandidates = OracleSqlParser.Instance.GetTerminalCandidates(terminalCandidateSourceToken);
            }

            InSelectList = (atAdHocTemporaryTerminal ? precedingTerminal : EffectiveTerminal).GetPathFilterAncestor(n => !String.Equals(n.Id, NonTerminals.QueryBlock), NonTerminals.SelectList) != null;

            var invalidGrammarFilteredNearestTerminal = Statement.GetNearestTerminalToPosition(cursorPosition, n => !String.Equals(n.Id, Terminals.ObjectAlias));
            var isWithinExplicitPartitionClause       = invalidGrammarFilteredNearestTerminal != null && String.Equals(invalidGrammarFilteredNearestTerminal.ParentNode.Id, NonTerminals.PartitionNameOrKeySet) && (invalidGrammarFilteredNearestTerminal != nearestTerminal || TerminalCandidates.Contains(Terminals.ObjectIdentifier));

            ExplicitPartition    = isWithinExplicitPartitionClause && String.Equals(invalidGrammarFilteredNearestTerminal.ParentNode.ParentNode.FirstTerminalNode.Id, Terminals.Partition);
            ExplicitSubPartition = isWithinExplicitPartitionClause && String.Equals(invalidGrammarFilteredNearestTerminal.ParentNode.ParentNode.FirstTerminalNode.Id, Terminals.Subpartition);
            if (isWithinExplicitPartitionClause)
            {
                if (String.Equals(EffectiveTerminal.Id, Terminals.ObjectIdentifier))
                {
                    ReferenceIdentifier = BuildReferenceIdentifier(new[] { EffectiveTerminal });
                }

                if (invalidGrammarFilteredNearestTerminal != nearestTerminal)
                {
                    EffectiveTerminal           = invalidGrammarFilteredNearestTerminal;
                    TerminalValuePartUntilCaret = null;
                }
            }

            if (!isWithinExplicitPartitionClause)
            {
                ResolveSuggestedKeywords();
            }

            var isCursorBetweenTwoTerminalsWithPrecedingIdentifierWithoutPrefix = IsCursorTouchingIdentifier && !ReferenceIdentifier.HasObjectIdentifier;

            Schema =
                TerminalCandidates.Contains(Terminals.SchemaIdentifier) ||
                (String.Equals(EffectiveTerminal.Id, Terminals.SchemaIdentifier) && String.Equals(nearestTerminal.Id, Terminals.Dot));

            var isCurrentClauseSupported =
                EffectiveTerminal.IsWithinSelectClauseOrExpression() ||
                EffectiveTerminal.ParentNode.Id.In(NonTerminals.WhereClause, NonTerminals.GroupByClause, NonTerminals.HavingClause, NonTerminals.OrderByClause) ||
                EffectiveTerminal.GetPathFilterAncestor(n => !String.Equals(n.Id, NonTerminals.NestedQuery), NonTerminals.WhereClause) != null;

            var isCandidateIdentifier = TerminalCandidates.Contains(Terminals.Identifier);

            if (isCurrentClauseSupported)
            {
                SchemaProgram = Column = isCandidateIdentifier || isCursorBetweenTwoTerminalsWithPrecedingIdentifierWithoutPrefix;

                var functionParameterOptionalExpression = EffectiveTerminal.GetPathFilterAncestor(n => !String.Equals(n.Id, NonTerminals.OptionalParameterExpressionList), NonTerminals.OptionalParameterExpression);
                if (functionParameterOptionalExpression != null)
                {
                    var functionParameterExpression = functionParameterOptionalExpression[NonTerminals.Expression];
                    SpecialFunctionParameter = functionParameterExpression != null && functionParameterExpression.TerminalCount == 1 && (functionParameterExpression.FirstTerminalNode.Id.IsLiteral() || String.Equals(functionParameterExpression.FirstTerminalNode.Id, Terminals.Identifier));
                }
            }

            DatabaseLink = TerminalCandidates.Contains(Terminals.DatabaseLinkIdentifier);
            JoinType     = (!isCursorTouchingTwoTerminals || nearestTerminal.Id.In(Terminals.Comma, Terminals.RightParenthesis)) && !isWithinExplicitPartitionClause && TerminalCandidates.Contains(Terminals.Join);
            DataType     = TerminalCandidates.Contains(Terminals.DataTypeIdentifier);

            InQueryBlockFromClause = effectiveTerminal.GetPathFilterAncestor(n => !String.Equals(n.Id, NonTerminals.QueryBlock), NonTerminals.FromClause) != null || (effectiveTerminal.Id == Terminals.From && effectiveTerminal.ParentNode.Id == NonTerminals.QueryBlock);
            var isWithinJoinCondition         = effectiveTerminal.GetPathFilterAncestor(n => !String.Equals(n.Id, NonTerminals.JoinClause) && !String.Equals(n.Id, NonTerminals.NestedQuery), NonTerminals.JoinColumnsOrCondition) != null;
            var isAfterUpdateOrDeleteTerminal = (nearestTerminal.Id.In(Terminals.Update, Terminals.Delete) || (String.Equals(nearestTerminal.Id, Terminals.From) && nearestTerminal.PrecedingTerminal != null && String.Equals(nearestTerminal.PrecedingTerminal.Id, Terminals.Delete))) && isCursorAfterToken;
            var isWithinQueryBlock            = nearestTerminal.GetAncestor(NonTerminals.QueryBlock) != null;
            var isWithinMainObjectReference   = nearestTerminal.GetAncestor(NonTerminals.TableReference) != null && !isWithinQueryBlock;
            var isInInsertIntoTableReference  = nearestTerminal.GetPathFilterAncestor(NodeFilters.BreakAtNestedQueryBlock, NonTerminals.DmlTableExpressionClause) != null ||
                                                (nearestTerminal.GetPathFilterAncestor(NodeFilters.BreakAtNestedQueryBlock, NonTerminals.InsertIntoClause) != null && nearestTerminal.Id == Terminals.Into && isCursorAfterToken);

            SchemaDataObject = (InQueryBlockFromClause || isAfterUpdateOrDeleteTerminal || isWithinMainObjectReference || isInInsertIntoTableReference) && !isWithinJoinCondition && !isWithinExplicitPartitionClause && TerminalCandidates.Contains(Terminals.ObjectIdentifier);

            var isWithinJoinClause = effectiveTerminal.GetPathFilterAncestor(n => !String.Equals(n.Id, NonTerminals.FromClause), NonTerminals.JoinClause) != null;

            JoinCondition = isWithinJoinClause && isCursorAfterEffectiveTerminal && (TerminalCandidates.Contains(Terminals.On) || String.Equals(nearestTerminal.Id, Terminals.On));

            var isWithinSelectList = (String.Equals(nearestTerminal.Id, Terminals.Select) && isCursorAfterToken) || nearestTerminal.GetPathFilterAncestor(n => !String.Equals(n.Id, NonTerminals.QueryBlock), NonTerminals.SelectList) != null;

            AllColumns = isWithinSelectList && TerminalCandidates.Contains(Terminals.Asterisk);

            SchemaDataObjectReference = !InQueryBlockFromClause && (TerminalCandidates.Contains(Terminals.ObjectIdentifier) || isCursorBetweenTwoTerminalsWithPrecedingIdentifierWithoutPrefix);

            PackageFunction = !String.IsNullOrEmpty(ReferenceIdentifier.ObjectIdentifierOriginalValue) && (isCandidateIdentifier || isCursorTouchingTwoTerminals);

            var inMainQueryBlockOrMainObjectReference = CurrentQueryBlock == SemanticModel.MainQueryBlock || (CurrentQueryBlock == null && SemanticModel.MainObjectReferenceContainer.MainObjectReference != null);

            Sequence = inMainQueryBlockOrMainObjectReference && (nearestTerminal.IsWithinSelectClause() || !nearestTerminal.IsWithinExpression() || nearestTerminal.GetPathFilterAncestor(n => n.Id != NonTerminals.QueryBlock, NonTerminals.InsertValuesClause) != null);

            var isWithinUpdateSetNonTerminal         = String.Equals(nearestTerminal.ParentNode.Id, NonTerminals.PrefixedIdentifier) || nearestTerminal.GetPathFilterAncestor(NodeFilters.BreakAtNestedQueryBlock, NonTerminals.SetColumnListEqualsNestedQuery) != null;
            var isAfterSetTerminal                   = isCursorAfterToken && String.Equals(nearestTerminal.Id, Terminals.Set);
            var isAfterCommaInChainedUpdateSetClause = isCursorAfterToken && String.Equals(nearestTerminal.Id, Terminals.Comma) && String.Equals(nearestTerminal.ParentNode.Id, NonTerminals.UpdateSetColumnOrColumnListChainedList);

            UpdateSetColumn = isCandidateIdentifier && (isWithinUpdateSetNonTerminal || isAfterSetTerminal || isAfterCommaInChainedUpdateSetClause);
            var columnList = nearestTerminal.GetAncestor(NonTerminals.ParenthesisEnclosedPrefixedIdentifierList);

            InsertIntoColumn = isCandidateIdentifier && String.Equals(columnList?.ParentNode?.Id, NonTerminals.InsertIntoClause);

            ColumnAlias = Column && nearestTerminal.IsWithinOrderByClause();
        }
Exemple #24
0
		public IEnumerable<ICodeSnippet> GetCodeGenerationItems(SqlDocumentRepository sqlDocumentRepository)
		{
			return Snippets.CodeGenerationItemCollection.Select(s => BuildCodeSnippet(s, SourcePosition.Empty))
				.OrderBy(s => s.Name);
		}
Exemple #25
0
 public void SetUp()
 {
     _documentRepository = TestFixture.CreateDocumentRepository();
 }
        public IToolTip GetToolTip(SqlDocumentRepository sqlDocumentRepository, int cursorPosition)
        {
            if (sqlDocumentRepository == null)
            {
                throw new ArgumentNullException(nameof(sqlDocumentRepository));
            }

            var node = sqlDocumentRepository.Statements.GetNodeAtPosition(cursorPosition);

            if (node == null)
            {
                var statement = sqlDocumentRepository.Statements.GetStatementAtPosition(cursorPosition);
                if (statement?.FirstUnparsedToken == null)
                {
                    return(null);
                }

                if (cursorPosition < statement.FirstUnparsedToken.Index || cursorPosition > statement.FirstUnparsedToken.Index + statement.FirstUnparsedToken.Value.Length)
                {
                    return(null);
                }

                return(BuildExpectedTokenListToolTip(statement.LastTerminalNode));
            }

            var tip = node.Type == NodeType.Terminal && !node.Id.IsIdentifier() ? node.Id : null;

            var validationModel = (OracleValidationModel)sqlDocumentRepository.ValidationModels[node.Statement];

            var nodeSemanticError = validationModel.SemanticErrors
                                    .Concat(validationModel.Suggestions)
                                    .FirstOrDefault(v => node.HasAncestor(v.Node, true));

            if (nodeSemanticError != null)
            {
                tip = nodeSemanticError.ToolTipText;
            }
            else
            {
                var semanticModel = validationModel.SemanticModel;
                var queryBlock    = semanticModel.GetQueryBlock(node);

                var toolTipBuilderVisitor = new OracleToolTipBuilderVisitor(node);

                switch (node.Id)
                {
                case Terminals.Asterisk:
                    return(BuildAsteriskToolTip(queryBlock, node));

                case Terminals.Min:
                case Terminals.Max:
                case Terminals.Sum:
                case Terminals.Avg:
                case Terminals.FirstValue:
                case Terminals.Count:
                case Terminals.Cast:
                case Terminals.Trim:
                case Terminals.CharacterCode:
                case Terminals.Variance:
                case Terminals.StandardDeviation:
                case Terminals.LastValue:
                case Terminals.Lead:
                case Terminals.Lag:
                case Terminals.ListAggregation:
                case Terminals.CumulativeDistribution:
                case Terminals.Rank:
                case Terminals.DenseRank:
                case Terminals.PercentileDiscreteDistribution:
                case Terminals.PercentileContinuousDistribution:
                case Terminals.NegationOrNull:
                case Terminals.RowIdPseudocolumn:
                case Terminals.RowNumberPseudocolumn:
                case Terminals.User:
                case Terminals.Level:
                case Terminals.Extract:
                case Terminals.JsonQuery:
                case Terminals.JsonExists:
                case Terminals.JsonValue:
                case Terminals.XmlCast:
                case Terminals.XmlElement:
                case Terminals.XmlSerialize:
                case Terminals.XmlParse:
                case Terminals.XmlQuery:
                case Terminals.XmlRoot:
                case Terminals.XmlForest:
                case Terminals.PlSqlIdentifier:
                case Terminals.ExceptionIdentifier:
                case Terminals.CursorIdentifier:
                case Terminals.DataTypeIdentifier:
                case Terminals.ObjectIdentifier:
                case Terminals.SchemaIdentifier:
                case Terminals.Identifier:
                    var reference = semanticModel.GetReference <OracleReference>(node);
                    reference?.Accept(toolTipBuilderVisitor);
                    if (toolTipBuilderVisitor.ToolTip != null)
                    {
                        return(toolTipBuilderVisitor.ToolTip);
                    }

                    goto default;

                case Terminals.DatabaseLinkIdentifier:
                case Terminals.Dot:
                case Terminals.AtCharacter:
                    var databaseLink = semanticModel.GetReference <OracleReference>(node)?.DatabaseLink;
                    if (databaseLink == null)
                    {
                        return(null);
                    }

                    return
                        (new ToolTipDatabaseLink(databaseLink)
                    {
                        ScriptExtractor = semanticModel.DatabaseModel.ObjectScriptExtractor,
                    });

                case Terminals.ParameterIdentifier:
                    return(BuildParameterToolTip(semanticModel, node));

                default:
                    var missingTokenLookupTerminal = GetTerminalForCandidateLookup(node, node.LastTerminalNode);
                    if (missingTokenLookupTerminal != null)
                    {
                        return(BuildExpectedTokenListToolTip(node));
                    }

                    break;
                }
            }

            return(String.IsNullOrEmpty(tip) ? null : new ToolTipObject {
                DataContext = tip
            });
        }
Exemple #27
0
		public IToolTip GetToolTip(SqlDocumentRepository sqlDocumentRepository, int cursorPosition)
		{
			if (sqlDocumentRepository == null)
			{
				throw new ArgumentNullException(nameof(sqlDocumentRepository));
			}

			var node = sqlDocumentRepository.Statements.GetNodeAtPosition(cursorPosition);
			if (node == null)
			{
				var statement = sqlDocumentRepository.Statements.GetStatementAtPosition(cursorPosition);
				if (statement?.FirstUnparsedToken == null)
				{
					return null;
				}

				if (cursorPosition < statement.FirstUnparsedToken.Index || cursorPosition > statement.FirstUnparsedToken.Index + statement.FirstUnparsedToken.Value.Length)
				{
					return null;
				}

				return BuildExpectedTokenListToolTip(statement.LastTerminalNode);
			}

			var tip = node.Type == NodeType.Terminal && !node.Id.IsIdentifier() ? node.Id : null;

			var validationModel = (OracleValidationModel)sqlDocumentRepository.ValidationModels[node.Statement];

			var nodeSemanticError = validationModel.SemanticErrors
				.Concat(validationModel.Suggestions)
				.FirstOrDefault(v => node.HasAncestor(v.Node, true));

			if (nodeSemanticError != null)
			{
				tip = nodeSemanticError.ToolTipText;
			}
			else
			{
				var semanticModel = validationModel.SemanticModel;
				var queryBlock = semanticModel.GetQueryBlock(node);

				var toolTipBuilderVisitor = new OracleToolTipBuilderVisitor(node);

				switch (node.Id)
				{
					case Terminals.Asterisk:
						return BuildAsteriskToolTip(queryBlock, node);
					case Terminals.Min:
					case Terminals.Max:
					case Terminals.Sum:
					case Terminals.Avg:
					case Terminals.FirstValue:
					case Terminals.Count:
					case Terminals.Cast:
					case Terminals.Trim:
					case Terminals.CharacterCode:
					case Terminals.Variance:
					case Terminals.StandardDeviation:
					case Terminals.LastValue:
					case Terminals.Lead:
					case Terminals.Lag:
					case Terminals.ListAggregation:
					case Terminals.CumulativeDistribution:
					case Terminals.Rank:
					case Terminals.DenseRank:
					case Terminals.PercentileDiscreteDistribution:
					case Terminals.PercentileContinuousDistribution:
					case Terminals.NegationOrNull:
					case Terminals.RowIdPseudocolumn:
					case Terminals.RowNumberPseudocolumn:
					case Terminals.User:
					case Terminals.Level:
					case Terminals.Extract:
					case Terminals.JsonQuery:
					case Terminals.JsonExists:
					case Terminals.JsonValue:
					case Terminals.XmlCast:
					case Terminals.XmlElement:
					case Terminals.XmlSerialize:
					case Terminals.XmlParse:
					case Terminals.XmlQuery:
					case Terminals.XmlRoot:
					case Terminals.XmlForest:
					case Terminals.PlSqlIdentifier:
					case Terminals.ExceptionIdentifier:
					case Terminals.CursorIdentifier:
					case Terminals.DataTypeIdentifier:
					case Terminals.ObjectIdentifier:
					case Terminals.SchemaIdentifier:
					case Terminals.Identifier:
						var reference = semanticModel.GetReference<OracleReference>(node);
						reference?.Accept(toolTipBuilderVisitor);
						if (toolTipBuilderVisitor.ToolTip != null)
						{
							return toolTipBuilderVisitor.ToolTip;
						}

						goto default;
					case Terminals.DatabaseLinkIdentifier:
					case Terminals.Dot:
					case Terminals.AtCharacter:
						var databaseLink = semanticModel.GetReference<OracleReference>(node)?.DatabaseLink;
						if (databaseLink == null)
						{
							return null;
						}

						return
							new ToolTipDatabaseLink(databaseLink)
							{
								ScriptExtractor = semanticModel.DatabaseModel.ObjectScriptExtractor,
							};

					case Terminals.ParameterIdentifier:
						return BuildParameterToolTip(semanticModel, node);

					default:
						var missingTokenLookupTerminal = GetTerminalForCandidateLookup(node, node.LastTerminalNode);
						if (missingTokenLookupTerminal != null)
						{
							return BuildExpectedTokenListToolTip(node);
						}

						break;
				}
			}

			return String.IsNullOrEmpty(tip) ? null : new ToolTipObject { DataContext = tip };
		}