public override void VisitMethodDeclarationNode(MethodDeclarationNode node)
        {
            if (_snapshot == null)
            {
                return;
            }
            base.VisitMethodDeclarationNode(node);
            var key = GenerateTag(node, _snapshot);

            if (key == null)
            {
                //We can't get a proper tag from this (likely ill-formed) method, so we'll skip it for now.
                var name = node.GetName(_snapshot);
                VSServiceProvider.Current.Logger.WriteToLog("Can't form a proper tag (likely ill-formed), ignoring member '" + name == null ? "" : name + "' for now...");
                return;
            }
            if (_methods.ContainsKey(key))
            {
                //For some reason, we have two methods with the same signature. There is
                //nothing we can do in this case so we just throw out the second method.
                VSServiceProvider.Current.Logger.WriteToLog("Two methods where found to have the exact same signature, ignoring second method for now...");
                return;
            }
            _methods.Add(key, node);
        }
Пример #2
0
 public override void VisitMethodDeclarationNode(MethodDeclarationNode node)
 {
     if (_snapshot == null) return;
     base.VisitMethodDeclarationNode(node);
     var key = GenerateTag(node, _snapshot);
     if (key == null)
     {
         //We can't get a proper tag from this (likely ill-formed) method, so we'll skip it for now.
         var name = node.GetName(_snapshot);
         VSServiceProvider.Current.Logger.WriteToLog("Can't form a proper tag (likely ill-formed), ignoring member '" + name == null ? "" : name + "' for now...");
         return;
     }
     if (_methods.ContainsKey(key))
     {
         //For some reason, we have two methods with the same signature. There is 
         //nothing we can do in this case so we just throw out the second method.
         VSServiceProvider.Current.Logger.WriteToLog("Two methods where found to have the exact same signature, ignoring second method for now...");
         return;
     }
     _methods.Add(key, node);
 }
        public static object GenerateTag(MethodDeclarationNode method, ITextSnapshot snapshot)
        {
            Contract.Requires(method != null);
            Contract.Requires(snapshot != null);

            var sb = new StringBuilder();

            //Append our name
            var name = method.GetName(snapshot);

            if (name == null)
            {
                return(null);
            }
            sb.Append(name);
            sb.Append('!');

            //Append our return type
            if (method.ReturnType != null)
            {
                var rn = method.ReturnType.GetName(snapshot);
                if (rn == null)
                {
                    rn = "NONAME";
                }
                sb.Append(rn);
                sb.Append('!');
            }

            //Append parameters
            if (method.FormalParameterList != null)
            {
                foreach (var param in method.FormalParameterList)
                {
                    //AppendParamter nameS
                    if (param.Identifier != null && param.Identifier.Name != null)
                    {
                        sb.Append(param.Identifier.Name.Text);
                        sb.Append('!');
                    }

                    //Append parameter type
                    if (param.Type != null)
                    {
                        var tn = param.Type.GetName(snapshot);
                        if (tn != null)
                        {
                            sb.Append(tn);
                            sb.Append('!');
                        }
                    }

                    //Append attributes?
                    if (param.Attributes != null && param.Attributes.Count > 0)
                    {
                    }

                    //Append flags
                    if (param.Flags != default(NodeFlags))
                    {
                        sb.Append(param.Flags);
                        sb.Append('!');
                    }
                }
            }

            //var snapshotSpan = method.GetSpan().Convert(snapshot);
            //var methodText = snapshotSpan.GetText();
            //string methodHeader;
            //if (methodText.Contains('{')) {
            //  methodHeader = methodText.Substring(0, methodText.IndexOf('{')).Trim();
            //} else if (methodText.Contains(';')) {
            //  methodHeader = methodText.Substring(0, methodText.IndexOf(';')).Trim();
            //} else
            //  return null;
            //sb.Append(methodHeader);
            //sb.Append('!');

            //Apend parent information
            var containingType = method.Parent;

            while (containingType != null)
            {
                var asClass = containingType.AsClass();
                if (asClass != null)
                {
                    sb.Append(asClass.Identifier.Name.Text);
                    sb.Append('!');
                    goto EndOfLoop;
                }
                var asInterface = containingType.AsInterface();
                if (asInterface != null)
                {
                    sb.Append(asInterface.Identifier.Name.Text);
                    sb.Append('!');
                    goto EndOfLoop;
                }

                /*Note: there is nothing we can do about the namespace, we can't seem to get namespace name info from the syntactic model.
                 */
EndOfLoop:
                containingType = containingType.Parent;
            }

            //Append flags
            if (method.Flags != default(NodeFlags))
            {
                sb.Append(method.Flags);
                sb.Append('!');
            }

            //Append what kind of node we are
            sb.Append(MethodTagSuffix);

            return(sb.ToString());
        }
Пример #4
0
    public static object GenerateTag(MethodDeclarationNode method, ITextSnapshot snapshot) {
      Contract.Requires(method != null);
      Contract.Requires(snapshot != null);

      var sb = new StringBuilder();

      //Append our name
      var name = method.GetName(snapshot);
      if (name == null)
        return null;
      sb.Append(name);
      sb.Append('!');

      //Append our return type
      if (method.ReturnType != null) {
        var rn = method.ReturnType.GetName(snapshot);
        if (rn == null) 
          rn = "NONAME";
        sb.Append(rn);
        sb.Append('!');
      }

      //Append parameters
      if (method.FormalParameterList != null) {
        foreach (var param in method.FormalParameterList) {

          //AppendParamter nameS
          if (param.Identifier != null && param.Identifier.Name != null) {
            sb.Append(param.Identifier.Name.Text);
            sb.Append('!');
          }

          //Append parameter type
          if (param.Type != null) {
            var tn = param.Type.GetName(snapshot);
            if (tn != null) {
              sb.Append(tn);
              sb.Append('!');
            }
          }

          //Append attributes?
          if (param.Attributes != null && param.Attributes.Count > 0) {
          }

          //Append flags
          if (param.Flags != default(NodeFlags)) {
            sb.Append(param.Flags);
            sb.Append('!');
          }
        }
      }

      //var snapshotSpan = method.GetSpan().Convert(snapshot);
      //var methodText = snapshotSpan.GetText();
      //string methodHeader;
      //if (methodText.Contains('{')) {
      //  methodHeader = methodText.Substring(0, methodText.IndexOf('{')).Trim();
      //} else if (methodText.Contains(';')) {
      //  methodHeader = methodText.Substring(0, methodText.IndexOf(';')).Trim();
      //} else
      //  return null;
      //sb.Append(methodHeader);
      //sb.Append('!');

      //Apend parent information
      var containingType = method.Parent;
      while (containingType != null) {
        var asClass = containingType.AsClass();
        if (asClass != null) {
          sb.Append(asClass.Identifier.Name.Text);
          sb.Append('!');
          goto EndOfLoop;
        }
        var asInterface = containingType.AsInterface();
        if (asInterface != null) {
          sb.Append(asInterface.Identifier.Name.Text);
          sb.Append('!');
          goto EndOfLoop;
        }
      /*Note: there is nothing we can do about the namespace, we can't seem to get namespace name info from the syntactic model. 
       */
      EndOfLoop:
        containingType = containingType.Parent;
      }

      //Append flags
      if (method.Flags != default(NodeFlags)) {
        sb.Append(method.Flags);
        sb.Append('!');
      }

      //Append what kind of node we are
      sb.Append(MethodTagSuffix);

      return sb.ToString();
    }