Ejemplo n.º 1
0
        public static List <SymbolDeclaration> FindDeclarations(SymbolDefinition symbol)
        {
            var candidates = FindDefinitionCandidates(symbol);

            foreach (var c in candidates)
            {
                var asset = AssetDatabase.LoadAssetAtPath(c, typeof(TextAsset)) as TextAsset;
                if (!asset)
                {
                    continue;
                }
                var buffer = FGTextBufferManager.GetBuffer(asset);
                buffer.LoadImmediately();
            }

            var newSymbol = FindNewSymbol(symbol);

            return(newSymbol == null ? null : newSymbol.declarations);
        }
Ejemplo n.º 2
0
        static FindResultsWindow.ResultType ValidateResultAsReference(string assetGuid, TextPosition location, int length, ref SymbolDefinition referencedSymbol)
        {
            var assetPath = AssetDatabase.GUIDToAssetPath(assetGuid);

            if (string.IsNullOrEmpty(assetPath))
            {
                return(FindResultsWindow.ResultType.RemoveResult);
            }

            var isCsScript = assetPath.EndsWith(".cs", System.StringComparison.OrdinalIgnoreCase);

            var buffer = FGTextBufferManager.GetBuffer(assetGuid);

            if (buffer == null)
            {
                return(FindResultsWindow.ResultType.RemoveResult);
            }

            if (buffer.Parser == null)
            {
                buffer.LoadImmediately();
                referencedSymbol = referencedSymbol.Rebind();
            }

            var formatedLine = buffer.formatedLines[location.line];

            var textLine    = buffer.lines[location.line];
            var isVarResult = length == 3 && (referencedSymbol is TypeDefinitionBase) && textLine.Substring(location.index, length) == "var";

            if (isCsScript)
            {
                if (formatedLine.regionTree.kind > FGTextBuffer.RegionTree.Kind.LastActive)
                {
                    if (isVarResult)
                    {
                        return(FindResultsWindow.ResultType.RemoveResult);
                    }
                    return(FindResultsWindow.ResultType.InactiveCode);
                }
            }
            else if (isVarResult)
            {
                return(FindResultsWindow.ResultType.RemoveResult);
            }

            int  tokenIndex;
            bool atTokenEnd;
            var  token = buffer.GetTokenAt(new TextPosition(location.line, location.index + 1), out location.line, out tokenIndex, out atTokenEnd);

            switch (token.tokenKind)
            {
            case SyntaxToken.Kind.Preprocessor:
                return(FindResultsWindow.ResultType.RemoveResult);

            case SyntaxToken.Kind.Comment:
            case SyntaxToken.Kind.PreprocessorArguments:
            case SyntaxToken.Kind.PreprocessorSymbol:
                if (isVarResult)
                {
                    return(FindResultsWindow.ResultType.RemoveResult);
                }
                return(FindResultsWindow.ResultType.Comment);

            case SyntaxToken.Kind.StringLiteral:
            case SyntaxToken.Kind.VerbatimStringLiteral:
                if (isVarResult)
                {
                    return(FindResultsWindow.ResultType.RemoveResult);
                }
                return(FindResultsWindow.ResultType.String);
            }

            if (!isCsScript || token.parent == null)
            {
                return(FindResultsWindow.ResultType.UnresolvedSymbol);
            }

            var resolvedSymbol = token.parent.resolvedSymbol;

            if (resolvedSymbol == null || resolvedSymbol.kind == SymbolKind.Error)
            {
                FGResolver.ResolveNode(token.parent.parent);
            }

            if (resolvedSymbol != null && resolvedSymbol.kind == SymbolKind.MethodGroup && token.parent.parent != null)
            {
                var nextLeaf = token.parent.parent.FindNextLeaf();
                if (nextLeaf != null && nextLeaf.IsLit("("))
                {
                    var nextNode = nextLeaf.parent;
                    if (nextNode.RuleName == "arguments")
                    {
                        FGResolver.ResolveNode(nextNode);
                        if (token.parent != null)
                        {
                            if (token.parent.resolvedSymbol == null || token.parent.resolvedSymbol.kind == SymbolKind.Error)
                            {
                                token.parent.resolvedSymbol = resolvedSymbol;
                            }
                        }
                    }
                }
            }

            resolvedSymbol = token.parent != null ? token.parent.resolvedSymbol : null;
            if (resolvedSymbol == null || resolvedSymbol.kind == SymbolKind.Error)
            {
                return(FindResultsWindow.ResultType.UnresolvedSymbol);
            }

            if (resolvedSymbol.kind == SymbolKind.Constructor || resolvedSymbol.kind == SymbolKind.Destructor)
            {
                resolvedSymbol = resolvedSymbol.parentSymbol;
            }
            if (resolvedSymbol == null || resolvedSymbol.kind == SymbolKind.Error)
            {
                return(FindResultsWindow.ResultType.UnresolvedSymbol);
            }

            var constructedSymbol = resolvedSymbol;

            resolvedSymbol = resolvedSymbol.GetGenericSymbol();

            if (referencedSymbol.kind == SymbolKind.MethodGroup && resolvedSymbol.kind == SymbolKind.Method)
            {
                resolvedSymbol = resolvedSymbol.parentSymbol;
            }

            if (resolvedSymbol != referencedSymbol)
            {
                var typeArgument    = referencedSymbol as TypeDefinitionBase;
                var constructedType = constructedSymbol as ConstructedTypeDefinition;
                if (isVarResult && typeArgument != null && constructedType != null)
                {
                    if (IsUsedAsTypeArgument(typeArgument.GetGenericSymbol() as TypeDefinitionBase, constructedType))
                    {
                        return(FindResultsWindow.ResultType.VarTemplateReference);
                    }
                }

                if (resolvedSymbol.kind == SymbolKind.Method && referencedSymbol.kind == SymbolKind.Method)
                {
                    if (resolvedSymbol.parentSymbol == referencedSymbol.parentSymbol)
                    {
                        return(FindResultsWindow.ResultType.MethodOverload);
                    }

                    var resolvedMethod   = resolvedSymbol as MethodDefinition;
                    var referencedMethod = referencedSymbol as MethodDefinition;
                    if (resolvedMethod != null && referencedMethod != null)
                    {
                        var resolvedType = resolvedMethod.parentSymbol as TypeDefinitionBase
                                           ?? resolvedMethod.parentSymbol.parentSymbol as TypeDefinitionBase;
                        var referencedType = referencedMethod.parentSymbol as TypeDefinitionBase
                                             ?? referencedMethod.parentSymbol.parentSymbol as TypeDefinitionBase;

                        var isInterface = resolvedType.kind == SymbolKind.Interface || referencedType.kind == SymbolKind.Interface;

                        var resolvedIsVirtual   = isInterface || resolvedMethod.IsOverride || resolvedMethod.IsVirtual || resolvedMethod.IsAbstract;
                        var referencedIsVirtual = isInterface || referencedMethod.IsOverride || referencedMethod.IsVirtual || referencedMethod.IsAbstract;
                        if (resolvedIsVirtual && referencedIsVirtual)
                        {
                            if (System.Linq.Enumerable.SequenceEqual(
                                    System.Linq.Enumerable.Select(resolvedMethod.GetParameters(), x => x.TypeOf()),
                                    System.Linq.Enumerable.Select(referencedMethod.GetParameters(), x => x.TypeOf())))
                            {
                                if (resolvedType.DerivesFrom(referencedType))
                                {
                                    return(FindResultsWindow.ResultType.OverridingMethod);
                                }
                                if (referencedType.DerivesFrom(resolvedType))
                                {
                                    return(FindResultsWindow.ResultType.OverriddenMethod);
                                }
                            }
                        }
                    }
                }

                if (resolvedSymbol.kind != SymbolKind.MethodGroup || referencedSymbol.parentSymbol != resolvedSymbol)
                {
                    return(FindResultsWindow.ResultType.RemoveResult);
                }
            }

            if (isVarResult)
            {
                return(FindResultsWindow.ResultType.VarReference);
            }

            if (FGResolver.IsWriteReference(token))
            {
                return(FindResultsWindow.ResultType.WriteReference);
            }
            return(FindResultsWindow.ResultType.ReadReference);
        }
Ejemplo n.º 3
0
        private void ReplaceAll()
        {
            Unsubscribe();

            FGTextBuffer buffer         = null;
            string       guid           = null;
            bool         canEditAll     = true;
            var          canEditBuffers = new HashSet <FGTextBuffer>();

            for (var i = flatResults.Count; i-- > 0;)
            {
                var result = flatResults[i];
                if (!result.selected)
                {
                    continue;
                }

                if (result.assetGuid != guid)
                {
                    guid   = result.assetGuid;
                    buffer = FGTextBufferManager.GetBuffer(guid);
                    if (buffer.IsLoading)
                    {
                        buffer.LoadImmediately();
                    }

                    if (FGCodeWindow.CodeWindows.All(x => x.TargetAssetGuid != guid))
                    {
                        var wnd = FGCodeWindow.OpenAssetInTab(guid);
                        if (wnd)
                        {
                            wnd.OnFirstUpdate();
                        }
                    }
                    if (!buffer.TryEdit())
                    {
                        canEditAll = false;
                    }
                    else
                    {
                        canEditBuffers.Add(buffer);
                    }
                }
            }

            if (!canEditAll)
            {
                if (!EditorUtility.DisplayDialog("Replace", "Some assets are locked and cannot be edited!", "Continue Anyway", "Cancel"))
                {
                    Close();
                }
            }

            buffer = null;
            guid   = null;
            var updatedLines = new HashSet <int>();

            for (var i = flatResults.Count; i-- > 0;)
            {
                var result = flatResults[i];
                if (!result.selected)
                {
                    continue;
                }

                if (result.assetGuid != guid)
                {
                    if (buffer != null)
                    {
                        foreach (var line in updatedLines)
                        {
                            buffer.UpdateHighlighting(line, line);
                        }
                        buffer.EndEdit();
                        FGTextBufferManager.AddBufferToGlobalUndo(buffer);
                        updatedLines.Clear();
                    }

                    guid   = result.assetGuid;
                    buffer = FGTextBufferManager.GetBuffer(guid);

                    if (buffer != null)
                    {
                        if (canEditBuffers.Contains(buffer))
                        {
                            buffer.BeginEdit("*Replace All");
                        }
                        else
                        {
                            buffer = null;
                        }
                    }
                }

                if (buffer != null)
                {
                    var from = new FGTextBuffer.CaretPos {
                        line = result.line, characterIndex = result.characterIndex
                    };
                    var to = new FGTextBuffer.CaretPos {
                        line = result.line, characterIndex = result.characterIndex + result.length
                    };
                    var insertAt = buffer.DeleteText(from, to);
                    if (replaceText != "")
                    {
                        buffer.InsertText(insertAt, replaceText);
                    }

                    updatedLines.Add(result.line);
                }
            }
            if (buffer != null)
            {
                foreach (var line in updatedLines)
                {
                    buffer.UpdateHighlighting(line, line);
                }
                buffer.EndEdit();
                FGTextBufferManager.AddBufferToGlobalUndo(buffer);
            }

            FGTextBufferManager.RecordGlobalUndo();
            Close();
        }