Exemplo n.º 1
0
        public static DocumentRange ToDocumentRange([CanBeNull] this ReparsedCodeCompletionContext context, [NotNull] ITreeNode treeNode)
        {
            var documentRange = treeNode.GetDocumentRange();

            if (context == null)
            {
                return(documentRange);
            }

            var reparsedTreeRange = treeNode.GetTreeTextRange();

            var document = documentRange.Document;

            if (document != null)
            {
                var originalDocRange = context.ToDocumentRange(reparsedTreeRange);
                return(new DocumentRange(document, originalDocRange));
            }
            else
            {
                var originalGeneratedTreeRange = context.ToOriginalTreeRange(reparsedTreeRange);
                var sandBox = treeNode.GetContainingNode <ISandBox>().NotNull("sandBox != null");

                var contextNode    = sandBox.ContextNode.NotNull("sandBox.ContextNode != null");
                var containingFile = contextNode.GetContainingFile().NotNull("containingFile != null");

                // todo: check for IFileImpl

                var translator        = containingFile.GetRangeTranslator();
                var originalTreeRange = translator.GeneratedToOriginal(originalGeneratedTreeRange);
                var originalDocRange  = translator.OriginalFile.GetDocumentRange(originalTreeRange);

                return(originalDocRange);
            }
        }
 public ReparsedPostfixExecutionContext([NotNull] Lifetime lifetime,
                                    [NotNull] CodeCompletionContext context,
                                    [NotNull] ReparsedCodeCompletionContext reparsedContext,
                                    [NotNull] string reparseString)
     : base(lifetime, context.Solution, context.TextControl,
      context.LookupItemsOwner, reparseString,
      context.CodeCompletionType == CodeCompletionType.AutomaticCompletion)
 {
     myReparsedContext = reparsedContext;
 }
Exemplo n.º 3
0
 public ReparsedPostfixExecutionContext([NotNull] Lifetime lifetime,
                                        [NotNull] CodeCompletionContext context,
                                        [NotNull] ReparsedCodeCompletionContext reparsedContext,
                                        [NotNull] string reparseString)
     : base(lifetime, context.Solution, context.TextControl,
            context.LookupItemsOwner, reparseString,
            context.CodeCompletionType == CodeCompletionType.AutomaticCompletion)
 {
     myReparsedContext = reparsedContext;
 }
Exemplo n.º 4
0
 public PascalCodeCompletionContext(
     CodeCompletionContext context,
     TextLookupRanges referenceRanges,
     TextLookupRanges elementRanges,
     ReparsedCodeCompletionContext unterminatedContext
     ) : base(context)
 {
     ElementRanges       = elementRanges;
     ReferenceRanges     = referenceRanges;
     UnterminatedContext = unterminatedContext;
 }
Exemplo n.º 5
0
 public CodeCompletionPostfixExecutionContext(
     [NotNull] CodeCompletionContext context, [NotNull] ReparsedCodeCompletionContext reparsedContext, [NotNull] string reparseString)
     : base(solution: context.Solution,
            textControl: context.TextControl,
            settingsStore: context.ContextBoundSettingsStore,
            reparseString: reparseString,
            //isPreciseMode: context.Parameters.CodeCompletionTypes.Length == 1
            isPreciseMode: context.Parameters.IsAutomaticCompletion
            )
 {
     myReparsedContext = reparsedContext;
 }
        public static IReferenceExpression ToReferenceExpression([CanBeNull] this ReparsedCodeCompletionContext context)
        {
            if (context == null)
            {
                return(null);
            }

            var reference = context.Reference as IReferenceExpressionReference;

            if (reference == null)
            {
                return(null);
            }

            return(reference.GetTreeNode() as IReferenceExpression);
        }
Exemplo n.º 7
0
        public static ISpecificCodeCompletionContext GetSpecificContext(
            CodeCompletionContext context, ReparsedCodeCompletionContext unterminatedContext, PsiLanguageType customLanguageType = null)
        {
            var elementToComplete = unterminatedContext.TreeNode;

            if (elementToComplete == null)
            {
                return(null);
            }

            var elementRange         = elementToComplete.GetTreeTextRange();
            var elementDocumentRange = unterminatedContext.ToDocumentRange(elementRange);

            var referenceToComplete    = unterminatedContext.Reference;
            var referenceRange         = referenceToComplete?.GetTreeTextRange() ?? elementRange;
            var referenceDocumentRange = unterminatedContext.ToDocumentRange(referenceRange);

            if (!referenceDocumentRange.IsValid())
            {
                return(null);
            }

            if (!referenceDocumentRange.Contains(context.EffectiveCaretDocumentOffset))
            {
                return(null);
            }
            if (!elementDocumentRange.Contains(context.EffectiveCaretDocumentOffset))
            {
                return(null);
            }

            var language = customLanguageType ?? PascalLanguage.Instance;

            if (language == null)
            {
                return(null);
            }

            var referenceRanges = GetTextLookupRanges(context, referenceDocumentRange);
            var elementRanges   = GetTextLookupRanges(context, elementDocumentRange);

            return(new PascalCodeCompletionContext(context, referenceRanges, elementRanges, unterminatedContext));
        }
        public PostfixTemplateAcceptanceContext([NotNull] ITreeNode reference,
      [NotNull] ICSharpExpression expression, DocumentRange replaceRange,
      bool forceMode, [NotNull] PostfixExecutionContext context)
        {
            myReparsedContext = context.ReparsedContext;
              myMostInnerExpression = expression;
              PostfixReferenceNode = reference;
              ForceMode = forceMode;
              PsiModule = context.PsiModule;
              LookupItemsOwner = context.LookupItemsOwner;
              MostInnerReplaceRange = replaceRange;

              if (!replaceRange.IsValid())
              {
            var referenceExpression = reference as IReferenceExpression;
            if (referenceExpression != null)
            {
              MostInnerReplaceRange =
            ToDocumentRange(referenceExpression.QualifierExpression.NotNull()).SetEndTo(
              ToDocumentRange(referenceExpression.Delimiter.NotNull()).TextRange.EndOffset);
            }

            var referenceName = reference as IReferenceName;
            if (referenceName != null)
            {
              MostInnerReplaceRange =
            ToDocumentRange(referenceName.Qualifier).SetEndTo(
              ToDocumentRange(referenceName.Delimiter).TextRange.EndOffset);
            }
              }

              // build expression contexts
              var expressionContexts = new List<PrefixExpressionContext>();
              var endOffset = Math.Max(
            MostInnerReplaceRange.TextRange.EndOffset,
            ToDocumentRange(reference).TextRange.EndOffset);

              for (ITreeNode node = expression; node != null; node = node.Parent)
              {
            if (node is ICSharpStatement) break;

            var expr = node as ICSharpExpression;
            if (expr == null || expr == reference) continue;

            var exprRange = myReparsedContext.ToDocumentRange(expr);
            if (!exprRange.IsValid())
              break; // stop when out of generated
            if (exprRange.TextRange.EndOffset > endOffset)
              break; // stop when 'a.var + b'

            // skip relational expressions like this: 'List<int.{here}>'
            if (CommonUtils.IsRelationalExpressionWithTypeOperand(expr)) continue;

            var expressionContext = new PrefixExpressionContext(this, expr);
            if (expressionContext.ReferencedElement is ITypeElement)
            {
              // skip types that are parts of 'List<T.>'-like expressions
              if (!CommonUtils.CanTypeBecameExpression(expression)) continue;
            }

            expressionContexts.Add(expressionContext);
            if (expressionContext.CanBeStatement) break;
              }

              Expressions = (expressionContexts.Count == 0)
            ? EmptyList<PrefixExpressionContext>.InstanceList
            : expressionContexts.AsReadOnly();
        }
        private static TextRange GetTextRange(ITreeNode node, ReparsedCodeCompletionContext context = null)
        {
            if (context == null)
            return node.GetDocumentRange().TextRange;

              return context.ToDocumentRange(node.GetTreeTextRange());
        }