示例#1
0
        /// <summary>
        /// Find or Create Class for Name and Using-List
        /// </summary>
        /// <param name="inProject"></param>
        /// <param name="inClassName"></param>
        /// <param name="inPossibleNamespaces"></param>
        /// <returns></returns>
        public static ClassContainer GetClassOrUnknownForType(this ProjectInformation inProject, string inClassName, List <string> inPossibleNamespaces)
        {
            if (string.IsNullOrEmpty(inClassName))
            {
                return(null);
            }
            var tmpClass = inProject.ClassForNameAndNamespaces(inClassName, inPossibleNamespaces);

            if (tmpClass != null)
            {
                return(tmpClass);
            }
            if (inProject.GetAliasType(inClassName) != null)
            {
                return(inProject.GetAliasType(inClassName));
            }
            var tmpUnknown = inProject.UnknownClassForNameAndNamespaces(inClassName, inPossibleNamespaces);

            if (tmpUnknown == null)
            {
                tmpUnknown = new UnknownTypeClass(inClassName)
                {
                    PossibleNamespace = inPossibleNamespaces
                };
                inProject.AddUnknownClass(tmpUnknown);
            }
            return(tmpUnknown);
        }
        /// <summary>
        /// Find or Create Class for Name and Using-List
        /// </summary>
        /// <param name="inProject"></param>
        /// <param name="inClassName"></param>
        /// <param name="inPossibleNamespaces"></param>
        /// <returns></returns>
        public static ClassContainer GetClassOrUnknownForType(this ProjectInformation inProject, string inClassName, ClassContainer inParentClass)
        {
            if (string.IsNullOrEmpty(inClassName))
            {
                return(null);
            }
            var tmpClass = inProject.ClassForNameAndNamespaces(inClassName, inParentClass.FullUsingList);

            if (tmpClass != null)
            {
                return(tmpClass);
            }
            if (inProject.GetAliasType(inClassName) != null)
            {
                return(inProject.GetAliasType(inClassName));
            }
            if (inParentClass.Type == null)
            {
                return(null);
            }
            var tmpGenericType = inParentClass.Type.GenericTypes.FirstOrDefault(inItem => inItem.Name == inClassName);

            if (tmpGenericType != null)
            {
                return(new ClassContainer
                {
                    Type = tmpGenericType,
                    Parent = inProject
                });
            }

            var tmpParentClass = inParentClass;

            while (tmpParentClass != null)
            {
                var tmpField = tmpParentClass.FieldList.FirstOrDefault(inItem => inItem.Name == inClassName);
                if (tmpField != null)
                {
                    return(new ClassContainer
                    {
                        Type = tmpField.Type,
                        Parent = inProject
                    });
                }
                tmpParentClass = tmpParentClass.GetParentClass();
            }

            var tmpUnknown = inProject.UnknownClassForNameAndNamespaces(inClassName, inParentClass.FullUsingList);

            if (tmpUnknown == null)
            {
                tmpUnknown = new UnknownTypeClass(inClassName)
                {
                    PossibleNamespace = inParentClass.FullUsingList,
                    Parent            = inProject
                };
                inProject.AddUnknownClass(tmpUnknown);
            }
            return(tmpUnknown);
        }
示例#3
0
        /// <summary>
        /// Write Code-Entry into C# Code
        /// </summary>
        /// <param name="inOutput"></param>
        /// <param name="inCodeEntry"></param>
        private TypeContainer CodeEntryHandling(ICodeEntry inCodeEntry, FieldNameFinder inNameFinder, TypeContainer inReturnType = null)
        {
            if (inCodeEntry == null)
            {
                return(null);
            }
            TypeContainer tmpReturnType = null;

            if (inCodeEntry is VariableDeclaration)
            {
                var tmpVarDecl = inCodeEntry as VariableDeclaration;
                inNameFinder.VariableList.Add(tmpVarDecl);

                var tmpConstant = new ConstantValue()
                {
                    Type = tmpVarDecl.Type
                };
                GetGlobalTypeForType(new FieldNameFinder(inNameFinder), tmpConstant, tmpVarDecl.Type.Name);
                tmpVarDecl.Type = tmpConstant.Type;
            }
            else if (inCodeEntry is ConstantValue)
            {
                var tmpConstant = (inCodeEntry as ConstantValue);
                var tmpVal      = tmpConstant.Value?.ToString() ?? tmpConstant.Type.Name;
                if (tmpConstant.Value is FieldContainer)
                {
                    tmpVal = (tmpConstant.Value as FieldContainer).Name;
                }
                else if (tmpConstant.Value is VariableDeclaration)
                {
                    tmpVal = (tmpConstant.Value as VariableDeclaration).Name;
                }
                else if (tmpVal.EndsWith("\""))
                {
                    //It's a number, nothing to do
                    tmpReturnType = ProjectInformation.GetAliasType("string")?.Type ?? tmpReturnType;
                }
                else if (RegexHelper.NumberCheck.IsMatch(tmpVal))
                {
                    //It's a number, nothing to do
                    tmpReturnType = ProjectInformation.GetAliasType("int")?.Type ?? tmpReturnType;
                }
                else
                {
                    //Access to Variable, Field, Param or static Class, so we need to do a lot here for Code-link
                    if (tmpVal == "this")
                    {
                        inNameFinder.VariableList = new List <VariableDeclaration>();
                        tmpConstant.Type          = inNameFinder.MethodeParentClass.Type;
                    }
                    else if (tmpVal == "base")
                    {
                        inNameFinder.Class = inNameFinder.Class.InterfaceList
                                             .Select(inItem => ProjectInformation.GetClassForType(inItem.Type.Name, new List <string> {
                            inItem.Type.Namespace
                        }))
                                             .FirstOrDefault(inItem => !inItem.IsInterface());
                        inNameFinder.VariableList = new List <VariableDeclaration>();
                        tmpConstant.Type          = inNameFinder.Class.GetParentClass().Type;
                    }
                    else if (tmpVal.StartsWith("\"") && tmpVal.EndsWith("\""))
                    {
                        //GetGlobalTypeForType(inNameFinder, tmpConstant, "String");
                    }
                    else if (new Regex("^\\-?[0-9]*(\\.[0-9]*)?(S|D|F|L)?$").IsMatch(tmpVal))
                    {
                        var tmpConstValue = tmpConstant.Value;
                        if (tmpVal.EndsWith("L"))
                        {
                            GetGlobalTypeForType(inNameFinder, tmpConstant, "long");
                        }
                        else if (tmpVal.EndsWith("D"))
                        {
                            GetGlobalTypeForType(inNameFinder, tmpConstant, "double");
                        }
                        else if (tmpVal.EndsWith("S"))
                        {
                            GetGlobalTypeForType(inNameFinder, tmpConstant, "short");
                        }
                        else if (tmpVal.EndsWith("F"))
                        {
                            GetGlobalTypeForType(inNameFinder, tmpConstant, "float");
                        }
                        else
                        {
                            GetGlobalTypeForType(inNameFinder, tmpConstant, "int");
                        }
                        tmpConstant.Value = tmpConstValue;
                    }
                    else
                    {
                        GetGlobalTypeForType(inNameFinder, tmpConstant, tmpVal);
                    }
                    tmpReturnType = tmpConstant.Type;
                }
            }
            else if (inCodeEntry is StatementCode)
            {
                var tmpStatement = inCodeEntry as StatementCode;
                if (tmpStatement.StatementType == Enum.StatementTypeEnum.If ||
                    tmpStatement.StatementType == Enum.StatementTypeEnum.Else ||
                    tmpStatement.StatementType == Enum.StatementTypeEnum.For ||
                    tmpStatement.StatementType == Enum.StatementTypeEnum.While)
                {
                    if (tmpStatement.InnerContent != null)
                    {
                        foreach (var tmpEntry in tmpStatement.InnerContent.CodeEntries)
                        {
                            CodeEntryHandling(tmpEntry, new FieldNameFinder(inNameFinder));
                        }
                    }
                    if (tmpStatement.StatementCodeBlocks != null)
                    {
                        foreach (var tmpEntry in tmpStatement.StatementCodeBlocks.SelectMany(inItem => inItem.CodeEntries))
                        {
                            CodeEntryHandling(tmpEntry, new FieldNameFinder(inNameFinder));
                        }
                    }
                }
                else if (tmpStatement.StatementType == Enum.StatementTypeEnum.Assert ||
                         tmpStatement.StatementType == Enum.StatementTypeEnum.Elvis)
                {
                    foreach (var tmpCodeBlock in tmpStatement.StatementCodeBlocks)
                    {
                        foreach (var tmpEntry in tmpCodeBlock.CodeEntries)
                        {
                            CodeEntryHandling(tmpEntry, new FieldNameFinder(inNameFinder));
                        }
                    }
                }
                else
                {
                    throw new NotImplementedException("CodeEntryHandling: StatementCode Handling not Implemented");
                }
            }
            else if (inCodeEntry is SetFieldWithValue)
            {
                var tmpFieldVal = inCodeEntry as SetFieldWithValue;
                foreach (var tmpEntry in tmpFieldVal.VariableToAccess.CodeEntries)
                {
                    CodeEntryHandling(tmpEntry, new FieldNameFinder(inNameFinder));
                }
                foreach (var tmpEntry in tmpFieldVal.ValueToSet.CodeEntries)
                {
                    CodeEntryHandling(tmpEntry, new FieldNameFinder(inNameFinder));
                }
            }
            else if (inCodeEntry is VariableAccess)
            {
                var tmpVarAccess = inCodeEntry as VariableAccess;
                inNameFinder.StackVariables(true, true);
                ClassContainer tmpPrevClass = null;
                if (!(tmpVarAccess.Access is VariableDeclaration))
                {
                    tmpReturnType = CodeEntryHandling(tmpVarAccess.Access, inNameFinder);
                    tmpPrevClass  = inNameFinder.Class;
                    if (tmpReturnType != null)
                    {
                        inNameFinder.Class = ProjectInformation.ClassFromBaseType(tmpReturnType);
                    }
                    else
                    {
                        inNameFinder.Class = null;
                    }
                }
                if (tmpVarAccess.Child != null)
                {
                    tmpReturnType = CodeEntryHandling(tmpVarAccess.Child, inNameFinder, inReturnType);
                }
                inNameFinder.Class = tmpPrevClass;

                inNameFinder.UnstackVariableList();
                if (tmpVarAccess.BaseDataSource != null)
                {
                    CodeEntryHandling(tmpVarAccess.BaseDataSource, inNameFinder, inReturnType);
                }
            }
            else if (inCodeEntry is ReturnCodeEntry)
            {
                foreach (var tmpEntry in (inCodeEntry as ReturnCodeEntry).CodeEntries)
                {
                    CodeEntryHandling(tmpEntry, inNameFinder);
                }
            }
            else if (inCodeEntry is NewObjectDeclaration)
            {
                var tmpObjectDecl = (inCodeEntry as NewObjectDeclaration);
                CodeEntryHandling(tmpObjectDecl.InnerCode, inNameFinder);
                if (tmpObjectDecl.ArgumentList != null)
                {
                    foreach (var tmpArgument in tmpObjectDecl.ArgumentList)
                    {
                        foreach (var tmpEntry in tmpArgument.CodeEntries)
                        {
                            CodeEntryHandling(tmpEntry, inNameFinder);
                        }
                    }
                }
            }
            else if (inCodeEntry is MethodeCall)
            {
                var tmpMethodeCall = inCodeEntry as MethodeCall;
                var tmpParentClass = inNameFinder.Class;
                while (tmpParentClass != null)
                {
                    tmpMethodeCall.MethodeLink = tmpParentClass.MethodeList.FirstOrDefault(inItem => inItem.Name == tmpMethodeCall.Name);
                    if (tmpMethodeCall.MethodeLink != null)
                    {
                        break;
                    }
                    tmpParentClass = tmpParentClass.GetParentClass();

                    foreach (var tmpParam in tmpMethodeCall.Parameter)
                    {
                        foreach (var tmpEntry in tmpParam.CodeEntries)
                        {
                            CodeEntryHandling(tmpEntry, new FieldNameFinder()
                            {
                                VariableList       = inNameFinder.GetMethodeVariableList(),
                                Class              = inNameFinder.MethodeParentClass ?? inNameFinder.Class,
                                MethodeParentClass = inNameFinder.MethodeParentClass
                            });
                        }
                    }
                }
                if (tmpMethodeCall.MethodeLink == null)
                {
                    //TODO Implement Extension Methode finding
                    if (inNameFinder.Class is UnknownTypeClass ||
                        inNameFinder.Class is ClassContainer)
                    {
                        if (tmpMethodeCall.Parameter.Count > 0)
                        {
                            foreach (var tmpParam in tmpMethodeCall.Parameter)
                            {
                                for (var tmpI = 0; tmpI < tmpParam.CodeEntries.Count; tmpI++)
                                {
                                    var tmpCodeBlock = tmpParam.CodeEntries[tmpI];
                                    CodeEntryHandling(tmpCodeBlock, new FieldNameFinder()
                                    {
                                        VariableList       = inNameFinder.GetMethodeVariableList(),
                                        Class              = inNameFinder.MethodeParentClass ?? inNameFinder.Class,
                                        MethodeParentClass = inNameFinder.MethodeParentClass
                                    });
                                }
                            }
                        }
                        var tmpMethode = Create.AddMethode(inNameFinder.Class, tmpMethodeCall.Name, inReturnType ?? TypeContainer.Void);
                        tmpMethode.ReturnType = /*inReturnType ??*/ TypeContainer.Void;
                        tmpReturnType         = tmpMethode.ReturnType;
                    }
                    else if (inNameFinder.Class == null)
                    {
                    }
                    else
                    {
                        throw new NotImplementedException("Unknown Methode on Class");
                    }
                }
                else
                {
                    if (tmpMethodeCall.Parameter.Count > 0)
                    {
                        foreach (var tmpParam in tmpMethodeCall.Parameter)
                        {
                            for (var tmpI = 0; tmpI < tmpParam.CodeEntries.Count; tmpI++)
                            {
                                var tmpCodeBlock = tmpParam.CodeEntries[tmpI];
                                CodeEntryHandling(tmpCodeBlock, new FieldNameFinder()
                                {
                                    VariableList       = inNameFinder.GetMethodeVariableList(),
                                    Class              = inNameFinder.MethodeParentClass ?? inNameFinder.Class,
                                    MethodeParentClass = inNameFinder.MethodeParentClass
                                });
                            }
                        }
                    }
                    tmpReturnType = tmpMethodeCall.MethodeLink.ReturnType;
                }
            }
            else if (inCodeEntry is CodeExpression)
            {
                var tmpExpr = inCodeEntry as CodeExpression;
                tmpReturnType = inReturnType;
                foreach (var tmpSubClause in tmpExpr.SubClauseEntries)
                {
                    foreach (var tmpCodeEntry in tmpSubClause.CodeEntries)
                    {
                        tmpReturnType = CodeEntryHandling(tmpCodeEntry, inNameFinder, tmpReturnType);
                    }
                }
            }
            else if (inCodeEntry is CodeBlockContainer)
            {
                var tmpExpr = inCodeEntry as CodeBlockContainer;
                tmpReturnType = inReturnType;
                foreach (var tmpEntry in tmpExpr.InnerBlock.CodeEntries)
                {
                    tmpReturnType = CodeEntryHandling(tmpEntry, inNameFinder);
                }
            }
            else if (inCodeEntry is TypeConversion)
            {
                var tmpExpr = inCodeEntry as TypeConversion;
                tmpReturnType = tmpExpr.Type;
                foreach (var tmpEntry in tmpExpr.PreconversionValue.CodeEntries)
                {
                    CodeEntryHandling(tmpEntry, inNameFinder);
                }
            }
            else
            {
                throw new NotImplementedException("Code Entry Type not Implement");
            }
            return(tmpReturnType);
        }