public void TestAddUnknownArgument() {
            MethodDeclarationNode mdn = new MethodDeclarationNode("MyMethod");
            TypeNode arg = new TypeNode("int", true);
            mdn.AddUnknownArgument(arg);
            Assert.IsNotNull(mdn.UnknownArguments);
            Assert.AreEqual(1, mdn.UnknownArguments.Count);
            Assert.AreEqual(arg, mdn.UnknownArguments[0]);

            VariableDeclarationNode vdn = new VariableDeclarationNode("foo");
            mdn.AddUnknownArgument(vdn);
            Assert.AreEqual(2, mdn.UnknownArguments.Count);
            Assert.AreEqual(arg, mdn.UnknownArguments[0]);
            Assert.AreEqual(vdn, mdn.UnknownArguments[1]);
        }
 public void TestConstructor_Name() {
     MethodDeclarationNode mdn = new MethodDeclarationNode("MyMethod");
     Assert.AreEqual("MyMethod", mdn.Name);
     Assert.IsNull(mdn.Context);
     Assert.AreEqual(MethodRole.Unknown, mdn.Role);
     Assert.IsNull(mdn.FormalParameters);
     Assert.IsNull(mdn.DeclaringClass);
     Assert.IsNull(mdn.ReturnType);
     Assert.IsNull(mdn.Action);
     Assert.IsNull(mdn.Theme);
     Assert.IsNull(mdn.SecondaryArguments);
     Assert.IsNull(mdn.UnknownArguments);
     Assert.IsFalse(mdn.IsReactive);
     Assert.IsFalse(mdn.IsConstructor);
     Assert.IsFalse(mdn.IsDestructor);
 }
Exemplo n.º 3
0
        public void TestConstructor_Context()
        {
            MethodContext         mc  = new MethodContext("STATUS", false);
            MethodDeclarationNode mdn = new MethodDeclarationNode("MyMethod", mc);

            Assert.AreEqual("MyMethod", mdn.Name);
            Assert.AreEqual(mc, mdn.Context);
            Assert.AreEqual(MethodRole.Unknown, mdn.Role);
            Assert.IsNull(mdn.FormalParameters);
            Assert.IsNull(mdn.DeclaringClass);
            Assert.IsNull(mdn.ReturnType);
            Assert.IsNull(mdn.Action);
            Assert.IsNull(mdn.Theme);
            Assert.IsNull(mdn.SecondaryArguments);
            Assert.IsNull(mdn.UnknownArguments);
            Assert.IsFalse(mdn.IsReactive);
            Assert.IsFalse(mdn.IsConstructor);
            Assert.IsFalse(mdn.IsDestructor);
        }
        /// <summary>
        /// Determines whether the given MethodDeclarationNode meets the conditions for this rule.
        /// </summary>
        /// <param name="node">The MethodDeclarationNode to test.</param>
        /// <returns>True if the node meets the conditions for this rule, False otherwise.</returns>
        protected override bool MakeClassification(MethodDeclarationNode node)
        {
            string firstWord = node.ParsedName[0].Text;

            if (IsChecker(firstWord) ||
                IsSpecialCase(firstWord) ||
                IsEventHandler(node.ParsedName)
                //|| IsEventHandler(node.FormalParameters) //pretty sure the parameters haven't been set yet
                || StartsNounPhrase(firstWord) ||
                IsPrepositionalPhrase(node.ParsedName) ||
                IsNonBaseVerb(firstWord))
            {
                return(false);
            }
            else
            {
                return(true);
            }
        }
Exemplo n.º 5
0
        public override void Execute()
        {
            Console.WriteLine("Using srcML file {0}", this.File);

            UnigramSwumBuilder builder = new UnigramSwumBuilder();

            if (CountFile != null)
            {
                Console.WriteLine("Initializing SamuraiIdSplitter using word count file {0}", this.CountFile);
                builder.Splitter = new SamuraiIdSplitter(CountFile);
            }
            Console.WriteLine("SwumBuilder initialized");

            if (this.SamplePercent <= 0)
            {
                this.SamplePercent = 100;
            }
            Random rand = new Random();

            SrcMLFile testFile      = new SrcMLFile(this.File);
            int       methodCount   = 0;
            var       functionTypes = new XName[] { SRC.Function, SRC.Constructor, SRC.Destructor };

            foreach (XElement file in testFile.FileUnits)
            {
                Console.WriteLine("File {0}:", file.Attribute("filename").Value);

                //print all the function names
                foreach (var func in (from func in file.Descendants()
                                      where functionTypes.Any(c => c == func.Name) && !func.Ancestors(SRC.Declaration).Any() && (rand.Next(100) < this.SamplePercent)
                                      select func))
                {
                    string funcName = SrcMLElement.GetNameForMethod(func).Value;
                    Console.WriteLine("<{0}> {1}", func.Name.LocalName, GetMethodSignature(func));

                    MethodDeclarationNode mdn = new MethodDeclarationNode(funcName, ContextBuilder.BuildMethodContext(func));
                    builder.ApplyRules(mdn);
                    Console.WriteLine(mdn.ToString() + Environment.NewLine);
                    methodCount++;
                }
            }
            Console.WriteLine("{0} functions analyzed", methodCount);
        }
Exemplo n.º 6
0
        /// <summary>
        /// Constructs SWUMs for each of the methods defined in <paramref name="unitElement"/> and adds them to the cache.
        /// </summary>
        /// <param name="unitElement">The root element for the file unit to be processed.</param>
        /// <param name="filePath">The path for the file represented by <paramref name="unitElement"/>.</param>
        /// <exception cref="System.ArgumentNullException"><paramref name="unitElement"/> is null.</exception>
        protected void AddSwumForMethodDefinitions(XElement unitElement, string filePath)
        {
            if (unitElement == null)
            {
                throw new ArgumentNullException("unitElement");
            }
            if (unitElement.Name != SRC.Unit)
            {
                throw new ArgumentException("Must be a SRC.Unit element", "unitElement");
            }

            //iterate over each method definition in the SrcML file
            var fileAttribute = unitElement.Attribute("filename");

            if (fileAttribute != null)
            {
                filePath = fileAttribute.Value;
            }
            var functions = from func in unitElement.Descendants()
                            where functionTypes.Contains(func.Name) && !func.Ancestors(SRC.Declaration).Any()
                            select func;

            foreach (XElement func in functions)
            {
                //construct SWUM on the function (if necessary)
                string sig = SrcMLElement.GetMethodSignature(func);
                lock (signaturesToSwum) {
                    if (signaturesToSwum.ContainsKey(sig))
                    {
                        //update the SwumDataRecord with the filename of the duplicate method
                        signaturesToSwum[sig].FileNames.Add(filePath);
                    }
                    else
                    {
                        MethodDeclarationNode mdn = ConstructSwumFromMethodElement(func);
                        var swumData = ProcessSwumNode(mdn);
                        swumData.FileNames.Add(filePath);
                        signaturesToSwum[sig] = swumData;
                    }
                }
            }
        }
Exemplo n.º 7
0
        } //end InClassChecker

        Dictionary <SwumRule, MethodDeclarationNode> BuildValidSwums(String name, MethodContext mc)
        {
            Dictionary <SwumRule, bool> inClasses = InClassChecker(name, mc);
            MethodDeclarationNode       mdn       = null;
            Dictionary <SwumRule, MethodDeclarationNode> validSwums = new Dictionary <SwumRule, MethodDeclarationNode>();

            foreach (KeyValuePair <SwumRule, bool> entry in inClasses)
            {
                if (entry.Value)
                {
                    mdn = new MethodDeclarationNode(name, mc);
                    entry.Key.InClass(mdn);
                    entry.Key.ConstructSwum(mdn);

                    validSwums.Add(entry.Key, mdn);
                }
            }

            return(validSwums);
        }
Exemplo n.º 8
0
        /// <summary>
        /// Construct the method summarizer
        /// </summary>
        /// <param name="md"></param>
        public SwumSummary(MethodDefinition md)
        {
            this.Method = md;
            var classBelong = md.GetAncestors <TypeDefinition>().FirstOrDefault();

            //class name
            if (classBelong != null)
            {
                ClassName = classBelong.Name;
            }
            else
            {
                ClassName = "";
            }

            //return type
            string returnType = "void";

            if (md.ReturnType != null)
            {
                returnType = md.ReturnType.ToString();
            }

            //Check if md returns primitive
            bool IsPrimitive = IsPrimitiveType(md.ReturnType);


            HashSet <FormalParameterRecord> paras = new HashSet <FormalParameterRecord>();

            foreach (var para in md.Parameters)
            {
                var vType    = para.VariableType;
                var tempPara = new FormalParameterRecord(vType.ToString(), BuiltInTypeFactory.IsBuiltIn(vType), para.Name);
                paras.Add(tempPara);
            }
            MethodContext mc = new MethodContext(returnType, IsPrimitive, ClassName, paras, false, md.IsConstructor, md.IsDestructor);

            this._mDeclarationNode = new MethodDeclarationNode(md.Name, mc);
            this._builder          = new UnigramSwumBuilder();
            this.IsSummarized      = false;
        }
        public void TestAddUnknownArguments() {
            MethodDeclarationNode mdn = new MethodDeclarationNode("MyMethod");
            Node[] args = new Node[] { new TypeNode("int", true), new VariableDeclarationNode("bar") };
            mdn.AddUnknownArguments(args);
            Assert.IsNotNull(mdn.UnknownArguments);
            Assert.AreEqual(args.Length, mdn.UnknownArguments.Count);
            for(int i = 0; i < args.Length; i++) {
                Assert.AreEqual(args[i], mdn.UnknownArguments[i]);
            }

            List<Node> args2 = new List<Node>() { new VariableDeclarationNode("xyzzy"), new VariableDeclarationNode("myParam") };
            mdn.AddUnknownArguments(args2);
            Assert.AreEqual(args.Length + args2.Count, mdn.UnknownArguments.Count);
            for(int i = 0; i < mdn.UnknownArguments.Count; i++) {
                if(i < args.Length) {
                    Assert.AreEqual(args[i], mdn.UnknownArguments[i]);
                } else {
                    Assert.AreEqual(args2[i - args.Length], mdn.UnknownArguments[i]);
                }
            }
        }
Exemplo n.º 10
0
        /// <summary>
        /// Constructs the Software Word Use Model for the given node.
        /// This method assumes that the node has already been tested to satisfy this Rule, using the InClass method.
        /// </summary>
        /// <param name="node">The node to construct SWUM for.</param>
        public override void ConstructSwum(ProgramElementNode node)
        {
            if (node is MethodDeclarationNode)
            {
                MethodDeclarationNode mdn = (MethodDeclarationNode)node;
                mdn.Parse(this.Splitter);
                this.PosTagger.TagNounPhrase(mdn.ParsedName);

                mdn.AssignStructuralInformation(this.Splitter, this.PosTagger);
                mdn.Theme = mdn.ParsedName;
                mdn.AddUnknownArguments(mdn.FormalParameters);

                //TODO: from Emily, how to fill in Action?
                mdn.IsDestructor = true;
                mdn.SwumRuleUsed = this;
            }
            else
            {
                //TODO: return error?
            }
        }
Exemplo n.º 11
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);
 }
Exemplo n.º 12
0
        public void TestCreateEquivalenceFromUnknownArguments()
        {
            var arg1 = new VariableDeclarationNode("arg1");
            var arg2 = new VariableDeclarationNode("arg2");
            var arg3 = new VariableDeclarationNode("arg3");
            var arg4 = new VariableDeclarationNode("arg4");
            var mdn  = new MethodDeclarationNode("MyMethod");

            mdn.AddUnknownArguments(new VariableDeclarationNode[] { arg1, arg2, arg3, arg4 });
            Assert.AreEqual(4, mdn.UnknownArguments.Count);

            var             themeNode = new PhraseNode(new string[] { "Relevent", "Args" });
            EquivalenceNode equiv     = mdn.CreateEquivalenceFromUnknownArguments(themeNode, new bool[] { true, false, true, false });

            Assert.AreEqual(3, equiv.EquivalentNodes.Count);
            Assert.IsTrue(equiv.EquivalentNodes.Contains(themeNode));
            Assert.IsTrue(equiv.EquivalentNodes.Contains(arg1));
            Assert.IsTrue(equiv.EquivalentNodes.Contains(arg3));
            Assert.AreEqual(2, mdn.UnknownArguments.Count);
            Assert.IsTrue(mdn.UnknownArguments.Contains(arg2));
            Assert.IsTrue(mdn.UnknownArguments.Contains(arg4));
        }
Exemplo n.º 13
0
        /// <summary>
        /// Constructs SWUM on the given srcML method element.
        /// </summary>
        /// <param name="methodElement">The srcML element to use. This can be either a Function, Constructor or Destructor.</param>
        /// <param name="className">The class on which this method is declared.</param>
        /// <returns>A MethodDeclarationNode with SWUM rules applied to it.</returns>
        protected MethodDeclarationNode ConstructSwumFromMethodElement(XElement methodElement, string className)
        {
            if (!functionTypes.Contains(methodElement.Name))
            {
                throw new ArgumentException("Element not a valid method type.", "methodElement");
            }

            string        funcName = SrcMLElement.GetNameForMethod(methodElement).Value;
            MethodContext mc       = ContextBuilder.BuildMethodContext(methodElement);

            //set the declaring class name, if it's been passed in
            //this is necessary because the xml from the database for inline methods won't have the surrounding class xml
            if (string.IsNullOrEmpty(mc.DeclaringClass) && !string.IsNullOrEmpty(className))
            {
                mc.DeclaringClass = className;
            }

            MethodDeclarationNode mdn = new MethodDeclarationNode(funcName, mc);

            builder.ApplyRules(mdn);
            return(mdn);
        }
Exemplo n.º 14
0
        } // End Same-Action main method

        /// <summary>
        /// Checks if each SwumRule (13) returns (InClass = true) for the given method name.  returns a dictionary of the SwumRule and boolean.
        /// Note that to build the swum you still have to run InClass for that method name.
        /// </summary>
        /// <param name="name">The name of the method</param>
        /// <param name="mc">The MethodContext object generated from the top-level method.  This is required to generate a swum for any method</param>
        /// <returns>Dictionary of SwumRules and boolean thats true if InClass = true</returns>
        Dictionary <SwumRule, bool> InClassChecker(String name, MethodContext mc)
        {
            MethodDeclarationNode mdn = new MethodDeclarationNode(name, mc);

            Dictionary <SwumRule, bool> rules = new Dictionary <SwumRule, bool>
            {
                { new BaseVerbRule(posData, tagger, splitter), false },
                { new CheckerRule(posData, tagger, splitter), false },
                { new ConstructorRule(posData, tagger, splitter), false },
                { new DefaultBaseVerbRule(posData, tagger, splitter), false },
                { new DestructorRule(posData, tagger, splitter), false },
                { new EmptyNameRule(posData, tagger, splitter), false },
                { new EventHandlerRule(posData, tagger, splitter), false },
                { new FieldRule(posData, tagger, splitter), false },
                { new LeadingPrepositionRule(posData, tagger, splitter), false },
                { new NonBaseVerbRule(posData, tagger, splitter), false },
                { new NounPhraseRule(posData, tagger, splitter), false },
                { new ReactiveRule(posData, tagger, splitter), false },
                { new SpecialCaseRule(posData, tagger, splitter), false }
                //{new SwumRule(posData, tagger, splitter),""},     these are abstract
                //{new UnigramMethodRule(posData, tagger, splitter),""},
                //{new UnigramRule(posData, tagger, splitter),""}
            };

            var listing = rules.Keys.ToList();

            foreach (SwumRule ent in listing)
            {
                // Console.WriteLine(ent.GetType() + "   InClass = " + ent.InClass(mdn));
                if (ent.InClass(mdn))
                {
                    rules[ent] = true;
                }
            }


            return(rules);
        } //end InClassChecker
Exemplo n.º 15
0
        public void TestLeadingPrepositionRule_OnGetAccObject()
        {
            var xml  = @"<function><type><name>LRESULT</name></type> <name><name>CMenuContainer</name><op:operator>::</op:operator><name>OnGetAccObject</name></name><parameter_list>( <param><decl><type><name>UINT</name></type> <name>uMsg</name></decl></param>, <param><decl><type><name>WPARAM</name></type> <name>wParam</name></decl></param>, <param><decl><type><name>LPARAM</name></type> <name>lParam</name></decl></param>, <param><decl><type><name>BOOL</name><type:modifier>&amp;</type:modifier></type> <name>bHandled</name></decl></param> )</parameter_list> <block>{
    <if>if <condition>(<expr><op:operator>(</op:operator><name>DWORD</name><op:operator>)</op:operator><name>lParam</name><op:operator>==</op:operator><op:operator>(</op:operator><name>DWORD</name><op:operator>)</op:operator><name>OBJID_CLIENT</name> <op:operator>&amp;&amp;</op:operator> <name>m_pAccessible</name></expr>)</condition><then> <block>{
        <return>return <expr><call><name>LresultFromObject</name><argument_list>(<argument><expr><name>IID_IAccessible</name></expr></argument>,<argument><expr><name>wParam</name></expr></argument>,<argument><expr><name>m_pAccessible</name></expr></argument>)</argument_list></call></expr>;</return>
    }</block></then> <else>else <block>{
        <expr_stmt><expr><name>bHandled</name><op:operator>=</op:operator><name>FALSE</name></expr>;</expr_stmt>
        <return>return <expr><lit:literal type=""number"">0</lit:literal></expr>;</return>
    }</block></else></if>
}</block></function>";
            var unit = fileUnitSetup.GetFileUnitForXmlSnippet(xml, "test.cpp");

            var func = unit.Descendants(SRC.Function).First();
            var mdn  = new MethodDeclarationNode(SrcMLElement.GetNameForMethod(func).Value, ContextBuilder.BuildMethodContext(func));

            builder.ApplyRules(mdn);

            Assert.AreEqual(typeof(LeadingPrepositionRule), mdn.SwumRuleUsed.GetType());
            var expected = @"handle(Verb) | On(NounModifier) Get(NounModifier) Acc(NounModifier) Object(NounIgnorable)
	 ++ [UINT(Noun) - u(Unknown) Msg(Unknown)] ++ [WPARAM(Noun) - w(Unknown) Param(Unknown)] ++ [LPARAM(Noun) - l(Unknown) Param(Unknown)] ++ [BOOL(Noun) - b(Unknown) Handled(Unknown)] ++ C(NounModifier) Menu(NounModifier) Container(NounIgnorable) ++ LRESULT(Noun)"    ;

            Assert.AreEqual(expected, mdn.ToString());
        }
Exemplo n.º 16
0
 private void AddRecommendation(Dictionary <string, int> recommendations, string p, int NormalWeight, MethodDeclarationNode methodDeclarationNode = null)
 {
     AddRecommendation(p.Trim(), NormalWeight, recommendations);
     if (methodDeclarationNode != null)
     {
         AddRecommendation(methodDeclarationNode.Name.Trim(), NormalWeight, recommendations);
     }
 }
Exemplo n.º 17
0
        public void TestAddSecondaryArgument() {
            MethodDeclarationNode mdn = new MethodDeclarationNode("MyMethod");
            VariableDeclarationNode vdn = new VariableDeclarationNode("foo");
            Assert.IsNull(mdn.SecondaryArguments);
            mdn.AddSecondaryArgument(vdn, new WordNode("to", PartOfSpeechTag.Preposition));
            Assert.AreEqual(1, mdn.SecondaryArguments.Count);
            var sec = mdn.SecondaryArguments[0];
            Assert.AreEqual(vdn, sec.Argument);
            Assert.AreEqual("to", sec.Preposition.Text);
            Assert.AreEqual(PartOfSpeechTag.Preposition, sec.Preposition.Tag);

            VariableDeclarationNode vdn2 = new VariableDeclarationNode("myParam");
            mdn.AddSecondaryArgument(vdn2, new WordNode("from", PartOfSpeechTag.Preposition));
            Assert.AreEqual(2, mdn.SecondaryArguments.Count);
            sec = mdn.SecondaryArguments[0];
            Assert.AreEqual(vdn, sec.Argument);
            Assert.AreEqual("to", sec.Preposition.Text);
            Assert.AreEqual(PartOfSpeechTag.Preposition, sec.Preposition.Tag);
            sec = mdn.SecondaryArguments[1];
            Assert.AreEqual(vdn2, sec.Argument);
            Assert.AreEqual("from", sec.Preposition.Text);
            Assert.AreEqual(PartOfSpeechTag.Preposition, sec.Preposition.Tag);
        }
Exemplo n.º 18
0
        static bool CheckCall(CallNode node, List <string> validVariables, List <string> validMethods,
                              List <string> variableTypes, ClassDeclarationNode currentClass, string targetReturnType)
        {
            ClassDeclarationNode returnTypeClass = null;
            int argCount = 0;

            if (node.CallerName == "this")  //nothing
            {
                returnTypeClass = currentClass;
            }
            else  //variable
            {
                if (node.CallerName != null)  // variable name check
                {
                    if (validVariables.Contains(node.CallerName))
                    {
                        returnTypeClass = findClass(variableTypes[validVariables.IndexOf(node.CallerName)]);
                    }
                    else
                    {
                        Error(node);
                        return(false);
                    }
                }
            }

            if (returnTypeClass == null && node.CalleeNames.Count == 0)
            {
                Error(node);
                return(false);
            }

            foreach (string calleeName in node.CalleeNames)  //check Callee Names
            {
                MethodDeclarationNode method = null;
                if (returnTypeClass == null)
                {
                    if (calleeName != node.CalleeNames[0])
                    {
                        Error(node);
                        return(false);
                    }
                    if (validMethods.Contains(calleeName))  //method
                    {
                        method = GetMethod(currentClass, calleeName);
                    }
                    else
                    if (validVariables.Contains(calleeName)) //variable
                    {
                        method          = null;
                        returnTypeClass = findClass(variableTypes[validVariables.IndexOf(calleeName)]);
                    }
                    else
                    if (findClass(calleeName) != null)  //constructor
                    {
                        method = null;
                        ClassDeclarationNode constructorClass = findClass(calleeName);
                        bool   isArgumentsOK     = false;
                        string argumentSignature = "";
                        foreach (ExpressionNode argument in node.arguments[argCount])
                        {
                            argumentSignature += GetReturnType(argument, validVariables, validMethods, variableTypes,
                                                               currentClass).name;
                        }
                        foreach (ConstructorDeclarationNode constructor in constructorClass.ConstructorDeclarations)
                        {
                            if (constructor.ParameterTypes.Count == node.arguments[argCount].Count)
                            {
                                string parameterSignature = "";
                                foreach (string parameterType in constructor.ParameterTypes)
                                {
                                    parameterSignature += parameterType;
                                }

                                if (parameterSignature == argumentSignature)
                                {
                                    isArgumentsOK = true;
                                    break;
                                }
                            }
                        }

                        if (!isArgumentsOK)
                        {
                            Error(node);
                            return(false);
                        }
                        returnTypeClass = constructorClass;
                    }
                    else
                    {
                        Error(node);
                        return(false);
                    }
                }
                else
                {
                    if (GetMethods(returnTypeClass)[0].Contains(calleeName))
                    {
                        method = GetMethod(returnTypeClass, calleeName);
                    }
                    else if (GetVariables(returnTypeClass)[0].Contains(calleeName))
                    {
                        returnTypeClass = findClass(GetVariables(returnTypeClass)[1][GetVariables(returnTypeClass)[0].IndexOf(calleeName)]);
                    }
                    else
                    {
                        Error(node);
                        return(false);
                    }
                }


                if (method != null)  //if method, check arguments
                {
                    if (method.ParameterTypes.Count > 0)
                    {
                        if (method.ParameterTypes.Count != node.arguments[argCount].Count)
                        {
                            Error(node);
                            return(false);
                        }

                        for (int i = 0; i < node.arguments[argCount].Count; i++)
                        {
                            if (!CheckExpression(node.arguments[argCount][i], validVariables, validMethods,
                                                 variableTypes, currentClass, method.ParameterTypes[i]))
                            {
                                Error(node.arguments[argCount][i]);
                                return(false);
                            }
                        }
                    }
                    returnTypeClass = method.ReturnType == null ? null : findClass(method.ReturnType);
                }
                argCount++;
            }

            if (targetReturnType != "-1" && returnTypeClass == null && targetReturnType != null) //check maybe we shouldn't return anything
            {
                Error(node);
                return(false);
            }

            if (returnTypeClass == null && targetReturnType == null)
            {
                return(true);
            }
            if (targetReturnType != "-1" && returnTypeClass.name != targetReturnType && !GetSuperClasses(returnTypeClass).Contains(targetReturnType))
            {
                Error(node);
                return(false);
            }

            return(true);
        }
Exemplo n.º 19
0
        private MethodSymbol BuildMethod(MethodDeclarationNode methodNode, TypeSymbol typeSymbol)
        {
            MethodSymbol method = null;

            if (methodNode.NodeType == ParseNodeType.ConstructorDeclaration)
            {
                method = new ConstructorSymbol(typeSymbol, (methodNode.Modifiers & Modifiers.Static) != 0);
            }
            else
            {
                TypeSymbol returnType = typeSymbol.SymbolSet.ResolveType(methodNode.Type, _symbolTable, typeSymbol);
                Debug.Assert(returnType != null);

                if (returnType != null)
                {
                    method = new MethodSymbol(methodNode.Name, typeSymbol, returnType);
                    BuildMemberDetails(method, typeSymbol, methodNode, methodNode.Attributes);

                    ICollection <string> conditions = null;
                    foreach (AttributeNode attrNode in methodNode.Attributes)
                    {
                        if (attrNode.TypeName.Equals("Conditional", StringComparison.Ordinal))
                        {
                            if (conditions == null)
                            {
                                conditions = new List <string>();
                            }

                            Debug.Assert(attrNode.Arguments[0] is LiteralNode);
                            Debug.Assert(((LiteralNode)attrNode.Arguments[0]).Value is string);

                            conditions.Add((string)((LiteralNode)attrNode.Arguments[0]).Value);
                        }
                    }

                    if (conditions != null)
                    {
                        method.SetConditions(conditions);
                    }
                }
            }

            if (method != null)
            {
                if ((methodNode.Modifiers & Modifiers.Abstract) != 0)
                {
                    method.SetImplementationState(SymbolImplementationFlags.Abstract);
                }
                else if ((methodNode.Modifiers & Modifiers.Override) != 0)
                {
                    method.SetImplementationState(SymbolImplementationFlags.Override);
                }

                if ((methodNode.Parameters != null) && (methodNode.Parameters.Count != 0))
                {
                    foreach (ParameterNode parameterNode in methodNode.Parameters)
                    {
                        ParameterSymbol paramSymbol = BuildParameter(parameterNode, method);
                        if (paramSymbol != null)
                        {
                            paramSymbol.SetParseContext(parameterNode);
                            method.AddParameter(paramSymbol);
                        }
                    }
                }

                if ((method.Visibility & MemberVisibility.Static) != 0)
                {
                    string scriptAlias = GetAttributeValue(methodNode.Attributes, "ScriptAlias");
                    if (scriptAlias != null)
                    {
                        method.SetAlias(scriptAlias);
                    }
                }
            }

            return(method);
        }
Exemplo n.º 20
0
        bool IParseNodeValidator.Validate(ParseNode node, CompilerOptions options, IErrorHandler errorHandler)
        {
            MethodDeclarationNode methodNode = (MethodDeclarationNode)node;

            if ((methodNode.Modifiers & Modifiers.Static) == 0 &&
                (methodNode.Modifiers & Modifiers.New) != 0)
            {
                errorHandler.ReportNodeValidationError(DSharpStringResources.STATIC_NEW_KEYWORD_UNSUPPORTED, methodNode);

                return(false);
            }

            if ((methodNode.Modifiers & Modifiers.Extern) != 0)
            {
                CustomTypeNode        typeNode       = (CustomTypeNode)methodNode.Parent;
                MethodDeclarationNode implMethodNode = null;

                if (methodNode.NodeType == ParseNodeType.MethodDeclaration)
                {
                    foreach (MemberNode memberNode in typeNode.Members)
                    {
                        if (memberNode.NodeType == ParseNodeType.MethodDeclaration &&
                            (memberNode.Modifiers & Modifiers.Extern) == 0 &&
                            memberNode.Name.Equals(methodNode.Name, StringComparison.Ordinal))
                        {
                            implMethodNode = (MethodDeclarationNode)memberNode;

                            break;
                        }
                    }
                }
                else if (methodNode.NodeType == ParseNodeType.ConstructorDeclaration)
                {
                    foreach (MemberNode memberNode in typeNode.Members)
                    {
                        if (memberNode.NodeType == ParseNodeType.ConstructorDeclaration &&
                            (memberNode.Modifiers & Modifiers.Extern) == 0)
                        {
                            implMethodNode = (MethodDeclarationNode)memberNode;

                            break;
                        }
                    }
                }

                if (implMethodNode == null)
                {
                    errorHandler.ReportNodeValidationError(DSharpStringResources.EXTERN_IMPLEMENTATION_FOUND_ERROR, methodNode);

                    return(false);
                }

                if ((methodNode.Modifiers & (Modifiers.Static | Modifiers.AccessMask)) !=
                    (implMethodNode.Modifiers & (Modifiers.Static | Modifiers.AccessMask)))
                {
                    errorHandler.ReportNodeValidationError(DSharpStringResources.EXTERN_STATIC_MEMBER_MISMATCH_ERROR, methodNode);
                }
            }


            return(true);
        }
Exemplo n.º 21
0
 public void TestToPlainString_Context() {
     var formals = new FormalParameterRecord[] { new FormalParameterRecord("SGVData*", false, "p"), new FormalParameterRecord("ASSchedule*", false, "p2") };
     MethodContext mc = new MethodContext("int", true, "MyClass", formals, true, false, false);
     MethodDeclarationNode mdn = new MethodDeclarationNode("CalcNewValue", mc);
     var splitter = new ConservativeIdSplitter();
     mdn.Parse(splitter);
     mdn.AssignStructuralInformation(splitter, new UnigramTagger());
     Assert.AreEqual("Calc New Value", mdn.ToPlainString());
 }
        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());
        }
Exemplo n.º 23
0
 public void TestAssignStructuralInformation_NullTagger() {
     MethodDeclarationNode mdn = new MethodDeclarationNode("MyMethod");
     mdn.AssignStructuralInformation(new NullSplitter(), null);
 }
Exemplo n.º 24
0
 /// <summary>
 /// Sets the Action and Theme properties of the given MethodDeclarationNode using the default algorithms.
 /// This also sets the node's SecondaryArguments and UnknownArguments properties.
 /// </summary>
 /// <param name="node">The MethodDeclarationNode to set the Action and Theme on.</param>
 protected void SetDefaultActionAndTheme(MethodDeclarationNode node)
 {
     node.Action = GetVerbPhrase(node.ParsedName, node.Preamble);
     SetPrepositionThemeAndArguments(node);
 }
Exemplo n.º 25
0
 public void TestCreateEquivalenceFromUnknownArguments_NullNode() {
     var arg1 = new VariableDeclarationNode("arg1");
     var mdn = new MethodDeclarationNode("MyMethod");
     mdn.AddUnknownArguments(new VariableDeclarationNode[] { arg1 });
     EquivalenceNode equiv = mdn.CreateEquivalenceFromUnknownArguments(null, new bool[] { true });
 }
Exemplo n.º 26
0
        public void TestCreateEquivalenceFromUnknownArguments() {
            var arg1 = new VariableDeclarationNode("arg1");
            var arg2 = new VariableDeclarationNode("arg2");
            var arg3 = new VariableDeclarationNode("arg3");
            var arg4 = new VariableDeclarationNode("arg4");
            var mdn = new MethodDeclarationNode("MyMethod");
            mdn.AddUnknownArguments(new VariableDeclarationNode[] { arg1, arg2, arg3, arg4 });
            Assert.AreEqual(4, mdn.UnknownArguments.Count);

            var themeNode = new PhraseNode(new string[] { "Relevent", "Args" });
            EquivalenceNode equiv = mdn.CreateEquivalenceFromUnknownArguments(themeNode, new bool[] { true, false, true, false });
            Assert.AreEqual(3, equiv.EquivalentNodes.Count);
            Assert.IsTrue(equiv.EquivalentNodes.Contains(themeNode));
            Assert.IsTrue(equiv.EquivalentNodes.Contains(arg1));
            Assert.IsTrue(equiv.EquivalentNodes.Contains(arg3));
            Assert.AreEqual(2, mdn.UnknownArguments.Count);
            Assert.IsTrue(mdn.UnknownArguments.Contains(arg2));
            Assert.IsTrue(mdn.UnknownArguments.Contains(arg4));
        }
Exemplo n.º 27
0
 public void TestCreateEquivalenceFromUnknownArguments_MissizedArray() {
     var arg1 = new VariableDeclarationNode("arg1");
     var mdn = new MethodDeclarationNode("MyMethod");
     mdn.AddUnknownArguments(new VariableDeclarationNode[] { arg1 });
     EquivalenceNode equiv = mdn.CreateEquivalenceFromUnknownArguments(new PhraseNode(), new bool[] { true, false });
 }
Exemplo n.º 28
0
        public void TestGetParse() {
            MethodContext mc = new MethodContext("int", true, "MyClass", null, true, false, false);
            MethodDeclarationNode mdn = new MethodDeclarationNode("CalcNewValue", mc);
            UnigramSwumBuilder builder = new UnigramSwumBuilder();
            builder.ApplyRules(mdn);

            var parsedName = mdn.GetParse();
            Assert.AreEqual(3, parsedName.Size());
            Assert.AreEqual("Calc", parsedName[0].Text);
            Assert.AreEqual(PartOfSpeechTag.Verb, parsedName[0].Tag);
            Assert.AreEqual("New", parsedName[1].Text);
            Assert.AreEqual(PartOfSpeechTag.NounModifier, parsedName[1].Tag);
            Assert.AreEqual("Value", parsedName[2].Text);
            Assert.AreEqual(PartOfSpeechTag.NounIgnorable, parsedName[2].Tag);
        }
Exemplo n.º 29
0
 public void TestToPlainString_NotParsed() {
     var formals = new FormalParameterRecord[] { new FormalParameterRecord("SGVData*", false, "p"), new FormalParameterRecord("ASSchedule*", false, "p2") };
     MethodContext mc = new MethodContext("int", true, "MyClass", formals, true, false, false);
     MethodDeclarationNode mdn = new MethodDeclarationNode("CalcNewValue", mc);
     Assert.AreEqual("CalcNewValue", mdn.ToPlainString());
 }
Exemplo n.º 30
0
        public void GenerateVoidReturnSUnit()
        {
            var dataProject = new DataProject <CompleteWorkingSet>(folderName,
                                                                   Path.GetFullPath(fullFilePath),
                                                                   "..//..//..//SrcML");

            dataProject.UpdateAsync().Wait();

            //get srcml stuff in order
            NamespaceDefinition globalNamespace;

            Assert.That(dataProject.WorkingSet.TryObtainReadLock(5000, out globalNamespace));

            //initialize swum stuff
            splitter = new ConservativeIdSplitter();
            tagger   = new UnigramTagger();
            posData  = new PCKimmoPartOfSpeechData();

            //find an example method
            var guiMethod         = globalNamespace.GetDescendants <MethodDefinition>().Where(m => m.Name == methodName).First();
            var guiMethodXElement = DataHelpers.GetElement(dataProject.SourceArchive, guiMethod.PrimaryLocation);

            // forget that, find ALL the methods
            var methods = globalNamespace.GetDescendants <MethodDefinition>().Where(m => m.Name == methodName);

            foreach (MethodDefinition method in methods)
            {
                //Console.WriteLine(method.ToString());
                var statements = method.ChildStatements;
                foreach (Statement statement in statements)
                {
                    var expressions = statement.GetExpressions();
                    foreach (Expression expression in expressions)
                    {
                        // Skip any expression that contains an assignment
                        if (expression.ToString().Contains(" =") || expression.ToString().Contains(" ->"))
                        {
                            continue;
                        }

                        // Print whatever's left. It should be a void return.
                        Console.WriteLine(expression.ToString());

                        // *** PoS tag it ***
                        // convert the string to 'PhraseNode' objects so we can feed them to SWUM
                        var pn = PhraseNode.Parse(new WordNode(expression.ToString()).ToString());

                        Console.WriteLine(pn.ToString());

                        // construct the "rule" to break up method names into sentences
                        BaseVerbRule thisrule = new BaseVerbRule(posData, tagger, splitter);

                        var methodNode = new MethodDeclarationNode(expression.ToString());

                        thisrule.ConstructSwum(methodNode);

                        Console.WriteLine(methodNode.ToString());
                    }
                }
            }
        }
Exemplo n.º 31
0
        /// <summary>
        /// Sets the Theme, SecondaryArguments and UnknownArguments properties of the given MethodDeclarationNode.
        /// </summary>
        /// <param name="node">The node to set the properties for.</param>
        private void SetPrepositionThemeAndArguments(MethodDeclarationNode node)
        {
            List <VariableDeclarationNode> unusedArgs = new List <VariableDeclarationNode>();

            //populate UnknownArgs
            if (node.ParsedName.Size() > 0 && BooleanArgumentVerbs.Contains(node.ParsedName[0].Text))
            {
                node.AddUnknownArguments(node.FormalParameters);
            }
            else
            {
                //only add non-boolean arguments
                foreach (VariableDeclarationNode arg in node.FormalParameters)
                {
                    if (arg.Type.Name.ToLower().Contains("bool"))
                    {
                        unusedArgs.Add(arg);
                    }
                    else
                    {
                        node.AddUnknownArgument(arg);
                    }
                }
            }

            int        prepIndex = FindFirstPreposition(node.ParsedName, 0);
            PhraseNode nameTheme = GetNounPhrase(node.ParsedName);
            bool       checkDO   = false; //check Direct Object in name for overlap
            bool       checkIO   = false; //check Indirect Object in name for overlap

            //Assign args
            if (prepIndex > -1)
            {
                //There's a preposition in the name
                WordNode   prep           = node.ParsedName[prepIndex];
                PhraseNode indirectObject = GetNounPhrase(node.ParsedName, prepIndex + 1);

                //set IO or P->NM
                if (!indirectObject.IsEmpty()) //IO in name
                {
                    node.AddSecondaryArgument(indirectObject, prep);
                    checkIO = true;
                }
                else if (node.UnknownArguments != null && node.UnknownArguments.Count() > 0) //or IO = f
                {
                    node.AddSecondaryArgument(node.UnknownArguments[0], prep);
                }
                else
                {
                    //The preposition doesn't seem to have an object, so change it to a NounModifier
                    prep.Tag  = PartOfSpeechTag.NounModifier;
                    nameTheme = GetNounPhrase(node.ParsedName); //reset name theme after changing prep POS tag
                }

                //set Theme
                if (!nameTheme.IsEmpty())
                {
                    //theme is in the name
                    nameTheme.SetLocation(Location.Name);
                    node.Theme = nameTheme;
                    checkDO    = true;
                }
                else //use class as theme
                {
                    node.Theme = node.DeclaringClass;
                }
            }
            else
            {
                //no prep in name, so set Theme only
                if (!nameTheme.IsEmpty())
                {
                    //theme is in the name
                    nameTheme.SetLocation(Location.Name);
                    node.Theme = nameTheme;
                    checkDO    = true;
                }
                else
                {
                    //theme is first UnknownArg, or class name
                    //also, potentially leaves class on list of unknown args, which is intentional
                    if (node.DeclaringClass != null)
                    {
                        node.AddUnknownArgument(node.DeclaringClass);
                    }
                    if (node.UnknownArguments != null && node.UnknownArguments.Count > 0)
                    {
                        node.Theme = node.UnknownArguments[0];
                        node.UnknownArguments.RemoveAt(0);
                    }
                }
            }

            //find equivalences
            if ((checkDO || checkIO) && node.UnknownArguments != null && node.UnknownArguments.Count > 0)
            {
                CheckOverlap(node, checkDO, checkIO);
            }

            //do cleanup
            node.AddUnknownArguments(unusedArgs);
            if (node.ReturnType != null && node.ReturnType.Name.ToLower() != "void")
            {
                //TODO: should this be done for primitive return types? SetDefaultUnknownArguments() excludes them
                node.AddUnknownArgument(node.ReturnType);
            }

            // Note: adding class as unknown arg indep of checkIO
            // if checkIO = true, and not checkDO, then DO will be class
            // if check IO = true and checkDO, then this will be executed
            // if no prep & DO not in name, class will already be on unused args
            // list for finding theme.
            if (checkDO && node.DeclaringClass != null)
            {
                node.AddUnknownArgument(node.DeclaringClass);
            }
        }
Exemplo n.º 32
0
 public void TestClearUnknownArguments_ExistingArgs() {
     MethodDeclarationNode mdn = new MethodDeclarationNode("MyMethod");
     Node[] args = new Node[] { new TypeNode("int", true), new VariableDeclarationNode("bar") };
     mdn.AddUnknownArguments(args);
     Assert.AreEqual(2, mdn.UnknownArguments.Count);
     mdn.ClearUnknownArguments();
     Assert.AreEqual(0, mdn.UnknownArguments.Count);
 }
Exemplo n.º 33
0
 public void TestAssignStructuralInformation() {
     var formals = new FormalParameterRecord[] { new FormalParameterRecord("SGVData*", false, "p"), new FormalParameterRecord("ASSchedule*", false, "p2") };
     MethodContext mc = new MethodContext("int", true, "MyClass", formals, true, false, false);
     MethodDeclarationNode mdn = new MethodDeclarationNode("MyMethod", mc);
     mdn.Parse(new NullSplitter());
     mdn.AssignStructuralInformation(new NullSplitter(), new NullTagger());
     Assert.AreEqual(Location.Name, mdn.ParsedName.Location);
     Assert.AreEqual("int", mdn.ReturnType.Name);
     Assert.IsTrue(mdn.ReturnType.IsPrimitive);
     Assert.AreEqual("MyClass", mdn.DeclaringClass.Name);
     Assert.AreEqual(2, mdn.FormalParameters.Count);
     Assert.AreEqual("SGVData*", mdn.FormalParameters[0].Type.Name);
     Assert.AreEqual("p", mdn.FormalParameters[0].Name);
     Assert.AreEqual("ASSchedule*", mdn.FormalParameters[1].Type.Name);
     Assert.AreEqual("p2", mdn.FormalParameters[1].Name);
 }
Exemplo n.º 34
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();
    }
Exemplo n.º 35
0
 public void TestCreateThemeFromPhrases_SecondNull() {
     MethodDeclarationNode mdn = new MethodDeclarationNode("MyMethod");
     PhraseNode pn2 = new PhraseNode(new string[] { "cowboy", "watermelon" });
     mdn.CreateThemeFromPhrases(null, pn2);
     Assert.AreSame(pn2, mdn.Theme);
     Assert.AreEqual(2, pn2.Size());
     Assert.AreEqual("cowboy", pn2[0].Text);
     Assert.AreEqual("watermelon", pn2[1].Text);
 }
Exemplo n.º 36
0
 public void TestClearSecondaryArguments_Null() {
     MethodDeclarationNode mdn = new MethodDeclarationNode("foo");
     mdn.ClearSecondaryArguments();
     Assert.IsNotNull(mdn.SecondaryArguments);
     Assert.AreEqual(0, mdn.SecondaryArguments.Count);
 }
Exemplo n.º 37
0
 public void TestCreateThemeFromPhrases_FirstNull() {
     MethodDeclarationNode mdn = new MethodDeclarationNode("MyMethod");
     PhraseNode pn1 = new PhraseNode(new string[] { "hello", "World" });
     mdn.CreateThemeFromPhrases(pn1, null);
     Assert.AreSame(pn1, mdn.Theme);
     Assert.AreEqual(2, pn1.Size());
     Assert.AreEqual("hello", pn1[0].Text);
     Assert.AreEqual("World", pn1[1].Text);
 }
Exemplo n.º 38
0
 /// <inheritdoc/>
 public override void VisitMethodDeclarationNode(MethodDeclarationNode node)
 {
 }
Exemplo n.º 39
0
 /// <summary>
 /// Determines whether the given MethodDeclarationNode meets the conditions for this rule.
 /// This method assumes that the name is parsed, preamble is stripped, and digits and prepositions are tagged.
 /// </summary>
 /// <param name="node">The MethodDeclarationNode to test.</param>
 /// <returns>True if the node meets the conditions for this rule, False otherwise.</returns>
 protected override bool MakeClassification(MethodDeclarationNode node)
 {
     return(node.ParsedName == null || node.ParsedName.IsEmpty());
 }
Exemplo n.º 40
0
 public void enterMethod(MethodDeclarationNode declaration)
 {
     methodInfos.add(declaration.getUserData(typeof(MethodInfo)));
 }
Exemplo n.º 41
0
        bool IParseNodeValidator.Validate(ParseNode node, CompilerOptions options, IErrorHandler errorHandler)
        {
            MethodDeclarationNode methodNode = (MethodDeclarationNode)node;

            if (((methodNode.Modifiers & Modifiers.Static) == 0) &&
                ((methodNode.Modifiers & Modifiers.New) != 0))
            {
                errorHandler.ReportError("The new modifier is not supported on instance members.",
                                         methodNode.Token.Location);
                return(false);
            }

            if ((methodNode.Modifiers & Modifiers.Extern) != 0)
            {
                AttributeNode altSigAttribute
                    = AttributeNode.FindAttribute(methodNode.Attributes, "AlternateSignature");
                if (altSigAttribute == null)
                {
                    errorHandler.ReportError("Extern methods should only be used to declare alternate signatures and marked with [AlternateSignature].",
                                             methodNode.Token.Location);
                    return(false);
                }

                CustomTypeNode        typeNode       = (CustomTypeNode)methodNode.Parent;
                MethodDeclarationNode implMethodNode = null;

                if (methodNode.NodeType == ParseNodeType.MethodDeclaration)
                {
                    foreach (MemberNode memberNode in typeNode.Members)
                    {
                        if ((memberNode.NodeType == ParseNodeType.MethodDeclaration) &&
                            ((memberNode.Modifiers & Modifiers.Extern) == 0) &&
                            memberNode.Name.Equals(methodNode.Name, StringComparison.Ordinal))
                        {
                            implMethodNode = (MethodDeclarationNode)memberNode;
                            break;
                        }
                    }
                }
                else if (methodNode.NodeType == ParseNodeType.ConstructorDeclaration)
                {
                    foreach (MemberNode memberNode in typeNode.Members)
                    {
                        if ((memberNode.NodeType == ParseNodeType.ConstructorDeclaration) &&
                            ((memberNode.Modifiers & Modifiers.Extern) == 0))
                        {
                            implMethodNode = (MethodDeclarationNode)memberNode;
                            break;
                        }
                    }
                }

                if (implMethodNode == null)
                {
                    errorHandler.ReportError("Extern methods used to declare alternate signatures should have a corresponding non-extern implementation as well.",
                                             methodNode.Token.Location);
                    return(false);
                }

                if ((methodNode.Modifiers & (Modifiers.Static | Modifiers.AccessMask)) !=
                    (implMethodNode.Modifiers & (Modifiers.Static | Modifiers.AccessMask)))
                {
                    errorHandler.ReportError("The implemenation method and associated alternate signature methods should have the same access type.",
                                             methodNode.Token.Location);
                }
            }

            return(true);
        }
Exemplo n.º 42
0
        public override void Execute()
        {
            if (Pause)
            {
                Console.WriteLine("Ready to begin (press Enter)");
                Console.ReadLine();
            }

            Console.WriteLine("Using srcML file {0}", this.File);

            var builder = new UnigramSwumBuilder();

            if (!string.IsNullOrWhiteSpace(CountFile))
            {
                Console.WriteLine("Initializing SamuraiIdSplitter using word count file {0}", this.CountFile);
                builder.Splitter = new SamuraiIdSplitter(CountFile);
            }
            Console.WriteLine("SwumBuilder initialized");

            int methodCount = 0, fieldCount = 0;

            {
                SrcMLFile testFile      = new SrcMLFile(this.File);
                var       functionTypes = new XName[] { SRC.Function, SRC.Constructor, SRC.Destructor };
                foreach (XElement file in testFile.FileUnits)
                {
                    string fileName = file.Attribute("filename").Value;
                    Console.WriteLine("File {0}:", fileName);

                    //compute SWUM on each function
                    foreach (var func in (from func in file.Descendants()
                                          where functionTypes.Contains(func.Name) && !func.Ancestors(SRC.Declaration).Any()
                                          select func))
                    {
                        var nameElement = SrcMLElement.GetNameForMethod(func);
                        if (nameElement != null)
                        {
                            string funcName      = nameElement.Value;
                            string funcSignature = SrcMLElement.GetMethodSignature(func);
                            if (PrintSwum)
                            {
                                Console.WriteLine("<{0}> {1}", func.Name.LocalName, funcSignature);
                            }

                            MethodDeclarationNode mdn = new MethodDeclarationNode(funcName, ContextBuilder.BuildMethodContext(func));
                            builder.ApplyRules(mdn);
                            methodSwum[string.Format("{0}:{1}", fileName, funcSignature)] = mdn;
                            if (PrintSwum)
                            {
                                Console.WriteLine(mdn.ToString() + Environment.NewLine);
                            }

                            methodCount++;
                        }
                    }

                    //compute SWUM on each field
                    foreach (var fieldDecl in (from declStmt in file.Descendants(SRC.DeclarationStatement)
                                               where !declStmt.Ancestors().Any(n => functionTypes.Contains(n.Name))
                                               select declStmt.Element(SRC.Declaration)))
                    {
                        int declPos = 1;
                        foreach (var nameElement in fieldDecl.Elements(SRC.Name))
                        {
                            string fieldName = nameElement.Elements(SRC.Name).Any() ? nameElement.Elements(SRC.Name).Last().Value : nameElement.Value;
                            if (PrintSwum)
                            {
                                Console.WriteLine("Field: {0}, Name: {1}", fieldDecl.Value, fieldName);
                            }

                            FieldDeclarationNode fdn = new FieldDeclarationNode(fieldName, ContextBuilder.BuildFieldContext(fieldDecl));
                            builder.ApplyRules(fdn);
                            fieldSwum[string.Format("{0}:{1}:{2}", fileName, fieldDecl.Value, declPos)] = fdn;
                            if (PrintSwum)
                            {
                                Console.WriteLine(fdn.ToString() + Environment.NewLine);
                            }

                            fieldCount++;
                            declPos++;
                        }
                    }
                }
            }

            GC.Collect();

            Console.WriteLine("{0} functions analyzed", methodCount);
            Console.WriteLine("{0} functions in dictionary", methodSwum.Count);
            Console.WriteLine("{0} fields analyzed", fieldCount);
            Console.WriteLine("{0} fields in dictionary", fieldSwum.Count);

            if (Pause)
            {
                Console.WriteLine("Finished building SWUM (press Enter)");
                Console.ReadLine();
            }
        }
 /// <summary>
 /// Determines whether the given MethodDeclarationNode meets the conditions for this rule.
 /// This method assumes that the name is parsed, preamble is stripped, and digits and prepositions are tagged.
 /// </summary>
 /// <param name="node">The MethodDeclarationNode to test.</param>
 /// <returns>True if the node meets the conditions for this rule, False otherwise.</returns>
 protected override bool MakeClassification(MethodDeclarationNode node)
 {
     node.AssignStructuralInformation(this.Splitter, this.PosTagger); //necessary to check event handler-ness
     return(IsEventHandler(node.FormalParameters));
 }
Exemplo n.º 44
0
        static ClassDeclarationNode GetReturnType(ExpressionNode nod, List <string> validVariables, List <string> validMethods,
                                                  List <string> variableTypes, ClassDeclarationNode currentClass)
        {
            if (nod.ExpressionType == "call")  //Check Call
            {
                ClassDeclarationNode returnTypeClass = null;
                CallNode             node            = nod.call;
                int argCount = 0;
                if (node.CallerName == "this")  //nothing
                {
                    returnTypeClass = currentClass;
                }
                else  //variable
                {
                    if (node.CallerName != null)  // variable name check
                    {
                        if (validVariables.Contains(node.CallerName))
                        {
                            returnTypeClass = findClass(variableTypes[validVariables.IndexOf(node.CallerName)]);
                        }
                        else
                        {
                            Error(node);
                        }
                    }
                }

                if (returnTypeClass == null && node.CalleeNames.Count == 0)
                {
                    Error(node);
                }

                foreach (string calleeName in node.CalleeNames)  //check Callee Names
                {
                    MethodDeclarationNode method = null;
                    if (returnTypeClass == null)
                    {
                        if (calleeName != node.CalleeNames[0])
                        {
                            Error(node);
                        }
                        if (validMethods.Contains(calleeName))  //method
                        {
                            method = GetMethod(currentClass, calleeName);
                        }
                        else
                        if (validVariables.Contains(calleeName)) //variable
                        {
                            method          = null;
                            returnTypeClass = findClass(variableTypes[validVariables.IndexOf(calleeName)]);
                        }
                        else
                        if (findClass(calleeName) != null)  //constructor
                        {
                            method = null;
                            ClassDeclarationNode constructorClass = findClass(calleeName);
                            bool   isArgumentsOK     = false;
                            string argumentSignature = "";
                            foreach (ExpressionNode argument in node.arguments[argCount])
                            {
                                argumentSignature += GetReturnType(argument, validVariables, validMethods, variableTypes,
                                                                   currentClass).name;
                            }
                            foreach (ConstructorDeclarationNode constructor in constructorClass.ConstructorDeclarations)
                            {
                                if (constructor.ParameterTypes.Count != node.arguments[argCount].Count)
                                {
                                    string parameterSignature = "";
                                    foreach (string parameterType in constructor.ParameterTypes)
                                    {
                                        parameterSignature += parameterType;
                                    }

                                    if (parameterSignature == argumentSignature)
                                    {
                                        isArgumentsOK = true;
                                        break;
                                    }
                                }
                            }

                            if (!isArgumentsOK)
                            {
                                Error(node);
                            }
                            returnTypeClass = constructorClass;
                        }
                        else
                        {
                            Error(node);
                        }
                    }
                    else
                    {
                        if (GetMethods(returnTypeClass)[0].Contains(calleeName))
                        {
                            method = GetMethod(returnTypeClass, calleeName);
                        }
                        else if (GetVariables(returnTypeClass)[0].Contains(calleeName))
                        {
                            returnTypeClass = findClass(GetVariables(returnTypeClass)[1][GetVariables(returnTypeClass)[0].IndexOf(calleeName)]);
                        }
                        else
                        {
                            Error(node);
                        }
                    }


                    if (method != null)  //if method, check arguments
                    {
                        if (method.ParameterTypes.Count > 0)
                        {
                            if (method.ParameterTypes.Count != node.arguments[argCount].Count)
                            {
                                Error(node);
                            }

                            for (int i = 0; i < node.arguments[argCount].Count; i++)
                            {
                                if (!CheckExpression(node.arguments[argCount][i], validVariables, validMethods,
                                                     variableTypes, currentClass, method.ParameterTypes[i]))
                                {
                                    Error(node.arguments[argCount][i]);
                                }
                            }
                        }
                        returnTypeClass = method.ReturnType == null ? null : findClass(method.ReturnType);
                    }
                    argCount++;
                }

                return(returnTypeClass);
            }
            else
            {
                if (nod.BooleanLiteral != null)
                {
                    return(findClass("Boolean"));
                }
                if (nod.IntegerLiteral != null)
                {
                    return(findClass("Integer"));
                }
                if (nod.FloatLiteral != null)
                {
                    return(findClass("Real"));
                }
            }

            return(null);
        }
 /// <summary>
 /// Determines whether the given MethodDeclarationNode meets the conditions for this rule.
 /// This method assumes that the name is parsed, preamble is stripped, and digits and prepositions are tagged.
 /// </summary>
 /// <param name="node">The MethodDeclarationNode to test.</param>
 /// <returns>True if the node meets the conditions for this rule, False otherwise.</returns>
 protected override bool MakeClassification(MethodDeclarationNode node)
 {
     return(IsEventHandler(node.ParsedName));
 }
Exemplo n.º 46
0
        public void GenerateEndingSUnit()
        {
            /*var dataProject = new DataProject<CompleteWorkingSet>("npp_6.2.3",
             *  Path.GetFullPath("..//..//..//projects//npp_6.2.3"),
             *  "..//..//..//SrcML");*/

            var dataProject = new DataProject <CompleteWorkingSet>(folderName,
                                                                   Path.GetFullPath(fullFilePath),
                                                                   "..//..//..//SrcML");

            dataProject.UpdateAsync().Wait();

            //get srcml stuff in order
            NamespaceDefinition globalNamespace;

            Assert.That(dataProject.WorkingSet.TryObtainReadLock(5000, out globalNamespace));

            //initialize swum stuff
            splitter = new ConservativeIdSplitter();
            tagger   = new UnigramTagger();
            posData  = new PCKimmoPartOfSpeechData();

            //find an example method, uses global methodName variable
            var testMethod         = globalNamespace.GetDescendants <MethodDefinition>().Where(m => m.Name == methodName).First();
            var testMethodXElement = DataHelpers.GetElement(dataProject.SourceArchive, testMethod.PrimaryLocation);

            //generate swum for method declaration
            MethodContext         mc  = ContextBuilder.BuildMethodContext(testMethodXElement);
            MethodDeclarationNode mdn = new MethodDeclarationNode(methodName, mc);

            //Console.WriteLine(mdn.ToString()); //returns nothing since it hasn't been written

            var exp = testMethod.GetDescendants();
            //var verb = mdn.Action.ToString();

            var expResult = exp.ElementAt(exp.Count() - 1);

            Console.WriteLine(expResult);
            MethodDeclarationNode expMDN = null;

            if (expResult is ReturnStatement)
            {
                Console.WriteLine("return");
            }
            else if (expResult.ToString().Contains(" = "))
            {
                Console.WriteLine("Ending S Unit contains '='");
            }
            else
            {
                var mCall = expResult.FindExpressions <MethodCall>().First();

                expMDN = new MethodDeclarationNode(mCall.Name, mc);
            }
            //MethodDeclarationNode mdn2 = new MethodDeclarationNode(expResult.ToString(), mc);

            //BaseVerbRule rule = new BaseVerbRule(posData, tagger, splitter);
            //Console.WriteLine("InClass = " + rule.InClass(mdn)); //REQUIRED in order for the ConstructSwum method to work
            //rule.ConstructSwum(mdn); //rewrites mdn.ToString to a SWUM breakdown
            //Console.WriteLine(mdn.Action.ToString());

            BaseVerbRule rule2 = new BaseVerbRule(posData, tagger, splitter);

            Console.WriteLine("InClass = " + rule2.InClass(expMDN)); //REQUIRED in order for the ConstructSwum method to work
            rule2.ConstructSwum(expMDN);                             //rewrites mdn.ToString to a SWUM breakdown
            Console.WriteLine(expMDN.Action.ToString());
            //Console.WriteLine(mdn.Action.ToString());
        }
Exemplo n.º 47
0
 public void TestCreateThemeFromPhrases() {
     MethodDeclarationNode mdn = new MethodDeclarationNode("MyMethod");
     PhraseNode pn1 = new PhraseNode(new string[] { "hello", "World" });
     PhraseNode pn2 = new PhraseNode(new string[] { "cowboy", "watermelon" });
     mdn.CreateThemeFromPhrases(pn1, pn2);
     Assert.AreSame(pn1, mdn.Theme);
     Assert.AreEqual(4, pn1.Size());
     Assert.AreEqual("hello", pn1[0].Text);
     Assert.AreEqual("World", pn1[1].Text);
     Assert.AreEqual("cowboy", pn1[2].Text);
     Assert.AreEqual("watermelon", pn1[3].Text);
 }
Exemplo n.º 48
0
        public void GenerateSameActionSUnit()
        {
            //   var dataProject = new DataProject<CompleteWorkingSet>("npp_6.2.3",
            //     Path.GetFullPath("..//..//..//projects//npp_6.2.3"),
            //   "..//..//..//SrcML");


            //var dataProject = new DataProject<CompleteWorkingSet>("CodeAnalysisToolkit",
            //    Path.GetFullPath("..//..//..//samples"),
            //    "..//..//..//SrcML");

            var dataProject = new DataProject <CompleteWorkingSet>(folderName,
                                                                   Path.GetFullPath(fullFilePath),
                                                                   "..//..//..//SrcML");


            List <String> success = new List <String>();
            Dictionary <SwumRule, bool> inClasses = null;

            bool debug = false; ///////////////// DEBUGGING

            // Get SrcML stuff in order
            dataProject.UpdateAsync().Wait();
            NamespaceDefinition globalNamespace;

            Assert.That(dataProject.WorkingSet.TryObtainReadLock(1000, out globalNamespace));


            // Initialize Swum
            splitter = new ConservativeIdSplitter();
            tagger   = new UnigramTagger();
            posData  = new PCKimmoPartOfSpeechData();



            var methodList             = globalNamespace.GetDescendants <MethodDefinition>().Where(m => m.Name == methodName);
            MethodDefinition topMethod = null;

            // Check if the method was found
            try
            {
                topMethod = methodList.First();
            }
            catch (System.InvalidOperationException)
            {
                Console.WriteLine("--ERROR: Method '" + methodName + "' Not Found--");
                Assert.Fail("Method '" + methodName + "' Not Found");
            }

            var guiMethodXElement = DataHelpers.GetElement(dataProject.SourceArchive, topMethod.PrimaryLocation);

            //generate swum for method declaration
            MethodContext         mc   = ContextBuilder.BuildMethodContext(guiMethodXElement);
            MethodDeclarationNode mdn  = new MethodDeclarationNode(methodName, mc);
            BaseVerbRule          rule = new BaseVerbRule(posData, tagger, splitter);

            Console.WriteLine("Method = \t" + methodName);
            Console.WriteLine("InClass = \t" + rule.InClass(mdn));


            // Get the action verb from the SWUM
            String methodVerb = GetMethodVerb(methodName, mc);

            Console.WriteLine("Verb = \t\t" + methodVerb);
            Console.WriteLine("============================");

            // Get all of the lines of code that contains the verb in any form
            var expr = topMethod.GetDescendants().Where(t => t.ToString().Contains(methodVerb)).ToArray();

            // Iterate each line
            foreach (Statement t in expr)
            {
                if (debug)
                {
                    Console.WriteLine("Line: " + t.ToString());
                }
                // This finds any method calls in this line and finds the verb in that method - from GetCallsTo()
                var methods = t.FindExpressions <MethodCall>(true).Where(c => c.ToString().ToLower().Contains(methodVerb));//c.Name.Contains(methodVerb));

                // Iterate through a list of the method calls in a line and find ones that contain the verb
                foreach (MethodCall i in methods)
                {
                    if (debug)
                    {
                        Console.WriteLine("===\n" + i.Name);
                    }

                    MethodDeclarationNode mdnNEW = new MethodDeclarationNode(i.Name, mc);

                    inClasses = InClassChecker(i.Name, mc);


                    String foundVerb = GetMethodVerb(i.Name, mc);
                    if (foundVerb.Equals("!NONE!"))
                    {
                        if (debug)
                        {
                            Console.WriteLine("   Method does not contain verb");
                        }
                    }
                    else
                    {
                        if (debug)
                        {
                            Console.WriteLine("GetMethodVerb= " + GetMethodVerb(i.Name, mc));
                        }

                        success.Add(i.Name);
                    }


                    if (debug)
                    {
                        Console.WriteLine("CompareSwums= " + CompareSwums(i.Name, mc));
                    }

                    // Debugging
                    if (debug)
                    {
                        int numbtrue = 0;
                        foreach (KeyValuePair <SwumRule, bool> entry in inClasses)
                        {
                            if (entry.Value)
                            {
                                numbtrue++;
                                mdnNEW = new MethodDeclarationNode(i.Name, mc);
                                entry.Key.InClass(mdnNEW);
                                entry.Key.ConstructSwum(mdnNEW);

                                Console.WriteLine("\t" + entry.Key.GetType().ToString() + new String(' ', 30 - entry.Key.GetType().ToString().Length) + " = " + mdnNEW.ToString());

                                if (mdnNEW.Action.ToPlainString().Equals(methodVerb, StringComparison.InvariantCultureIgnoreCase))
                                {
                                    Console.WriteLine("\tMethod contains the verb");
                                }
                                else
                                {
                                    Console.WriteLine("\tMethod does not contain the verb" + "\n");
                                }
                            }
                        }
                        Console.WriteLine(" Inclasses  = " + numbtrue);
                    } //end if debug
                }     // End Method Iteration
            }         // End Line Iteration

            if (success.Count == 0)
            {
                Console.WriteLine("===== No Same-Action Methods Found =====");
                //Assert.Fail("No Same-Action Methods found");
            }
            else
            {
                Console.WriteLine("\n============= SUCCESSES ===============");
                foreach (String i in success)
                {
                    Console.WriteLine(i);
                }
                //Assert.Pass("Same-Action methods found, check Output");
            }



            dataProject.WorkingSet.ReleaseReadLock();
        } // End Same-Action main method
Exemplo n.º 49
0
 public void TestClearSecondaryArguments_Null_ExistingArgs() {
     MethodDeclarationNode mdn = new MethodDeclarationNode("MyMethod");
     VariableDeclarationNode vdn = new VariableDeclarationNode("foo");
     mdn.AddSecondaryArgument(vdn, new WordNode("to", PartOfSpeechTag.Preposition));
     Assert.AreEqual(1, mdn.SecondaryArguments.Count);
     mdn.ClearSecondaryArguments();
     Assert.AreEqual(0, mdn.SecondaryArguments.Count);
 }
Exemplo n.º 50
0
        /// <summary>
        /// Checks for semantic overlaps between parts of the given method's name and its UnknownArguments.
        /// If overlaps are found, appropriate EquivalenceNodes are created.
        /// </summary>
        /// <param name="mdn">The MethodDeclarationNode to check for overlaps.</param>
        /// <param name="checkDO">Indicates whether the Direct Object was taken from the method name, and therefore the Theme must be checked for overlap with UnknownArguments.</param>
        /// <param name="checkIO">Indicates whether the Indirect Object was taken from the method name, and therefore the SecondaryArguments must be checked for overlap with UnknownArguments.</param>
        private void CheckOverlap(MethodDeclarationNode mdn, bool checkDO, bool checkIO)
        {
            if (mdn.ParsedName[0].Text.ToLower() == "set")
            {
                return; //special case
            }

            PhraseNode   theme = null;
            ArgumentNode arg   = null;

            //get DO word from name
            string wordDO = "";

            if (checkDO) //theme is in the method name
            {
                theme  = (PhraseNode)mdn.Theme;
                wordDO = theme.LastWord().Text;
            }

            //get IO word from name
            string wordIO = "";

            if (checkIO) //IO is in the method name
            {
                arg = mdn.SecondaryArguments[0];
                PhraseNode argn = (PhraseNode)arg.Argument;
                wordIO = argn.LastWord().Text;
                if (wordDO == wordIO)
                {
                    return; //no equivalence if multiple overlap
                }
            }

            //find overlap
            List <Node> unknownArgs       = mdn.UnknownArguments;
            List <Node> DOOverlappingArgs = new List <Node>();
            List <Node> IOOverlappingArgs = new List <Node>();

            for (int i = 0; i < unknownArgs.Count; i++)
            {
                if (unknownArgs[i] is VariableDeclarationNode)
                {
                    VariableDeclarationNode var = (VariableDeclarationNode)unknownArgs[i];
                    PhraseNode name             = var.ParsedName;
                    PhraseNode type             = var.Type.ParsedName;
                    bool       DOOverlaps       = false;
                    bool       IOOverlaps       = false;

                    if (checkDO)
                    {
                        DOOverlaps = HasOverlap(name, wordDO) || HasOverlap(type, wordDO);
                        if (DOOverlaps)
                        {
                            DOOverlappingArgs.Add(unknownArgs[i]);
                        }
                    }
                    if (checkIO)
                    {
                        IOOverlaps = HasOverlap(name, wordIO) || HasOverlap(type, wordIO);
                        if (IOOverlaps)
                        {
                            IOOverlappingArgs.Add(unknownArgs[i]);
                        }
                    }

                    if (DOOverlaps && IOOverlaps)
                    {
                        return; //no equivalence if multiple overlap
                    }
                }
            }

            //Create overlap in SWUM
            if (DOOverlappingArgs.Count > 0)
            {
                EquivalenceNode en = mdn.CreateEquivalenceFromUnknownArguments(theme, DOOverlappingArgs);
                mdn.Theme = en; //reset theme in MethodDeclarationNode to new equivalence node
            }
            if (IOOverlappingArgs.Count > 0)
            {
                EquivalenceNode en = mdn.CreateEquivalenceFromUnknownArguments(arg.Argument, IOOverlappingArgs);
                arg.Argument = en; //reset mdn.SecondaryArguments to point to new equivalence node
            }
        }
Exemplo n.º 51
0
 public void TestToPlainString_DefaultContext() {
     var mdn = new MethodDeclarationNode("MyMethod", new MethodContext());
     var splitter = new ConservativeIdSplitter();
     mdn.Parse(splitter);
     mdn.AssignStructuralInformation(splitter, new UnigramTagger());
     Assert.AreEqual("My Method", mdn.ToPlainString());
 }