Beispiel #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 = symbol.Rebind();
		var declarations = newSymbol == null ? null : newSymbol.declarations;
		return declarations ?? symbol.declarations;
	}
Beispiel #2
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    = symbol.Rebind();
            var declarations = newSymbol == null ? null : newSymbol.declarations;

            return(declarations ?? symbol.declarations);
        }
Beispiel #3
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);
        }
Beispiel #4
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;
	}