Пример #1
0
        public static BuildResult GenerateCodeBehind(
            AspNetAppProject project,
            string filename,
            AspNetParsedDocument document,
            out CodeCompileUnit ccu)
        {
            ccu = null;
            var    result    = new BuildResult();
            string className = document.Info.InheritedClass;

            AddErrorsToResult(result, filename, document.Errors);
            if (result.ErrorCount > 0)
            {
                return(result);
            }

            if (string.IsNullOrEmpty(className))
            {
                return(result);
            }

            var refman = new DocumentReferenceManager(project)
            {
                Doc = document
            };
            var memberList = new MemberListBuilder(refman, document.XDocument);

            memberList.Build();

            AddErrorsToResult(result, filename, memberList.Errors);
            if (result.ErrorCount > 0)
            {
                return(result);
            }

            //initialise the generated type
            ccu = new CodeCompileUnit();
            var namespac = new CodeNamespace();

            ccu.Namespaces.Add(namespac);
            var typeDecl = new CodeTypeDeclaration {
                IsClass   = true,
                IsPartial = true,
            };

            namespac.Types.Add(typeDecl);

            //name the class and namespace
            int namespaceSplit = className.LastIndexOf('.');

            if (namespaceSplit > -1)
            {
                namespac.Name = project.StripImplicitNamespace(className.Substring(0, namespaceSplit));
                typeDecl.Name = className.Substring(namespaceSplit + 1);
            }
            else
            {
                typeDecl.Name = className;
            }

            string masterTypeName = null;

            if (!String.IsNullOrEmpty(document.Info.MasterPageTypeName))
            {
                masterTypeName = document.Info.MasterPageTypeName;
            }
            else if (!String.IsNullOrEmpty(document.Info.MasterPageTypeVPath))
            {
                try {
                    ProjectFile          resolvedMaster       = project.ResolveVirtualPath(document.Info.MasterPageTypeVPath, document.FileName);
                    AspNetParsedDocument masterParsedDocument = null;
                    if (resolvedMaster != null)
                    {
                        masterParsedDocument = TypeSystemService.ParseFile(project, resolvedMaster.FilePath) as AspNetParsedDocument;
                    }
                    if (masterParsedDocument != null && !String.IsNullOrEmpty(masterParsedDocument.Info.InheritedClass))
                    {
                        masterTypeName = masterParsedDocument.Info.InheritedClass;
                    }
                } catch (Exception ex) {
                    LoggingService.LogWarning("Error resolving master page type", ex);
                }
                if (string.IsNullOrEmpty(masterTypeName))
                {
                    var msg = string.Format("Could not find type for master '{0}'", document.Info.MasterPageTypeVPath);
                    result.AddError(filename, msg);
                    return(result);
                }
            }

            if (masterTypeName != null)
            {
                var masterProp = new CodeMemberProperty {
                    Name       = "Master",
                    Type       = new CodeTypeReference(masterTypeName),
                    HasGet     = true,
                    HasSet     = false,
                    Attributes = MemberAttributes.Public | MemberAttributes.New | MemberAttributes.Final,
                };
                masterProp.GetStatements.Add(new CodeMethodReturnStatement(
                                                 new CodeCastExpression(masterTypeName,
                                                                        new CodePropertyReferenceExpression(
                                                                            new CodeBaseReferenceExpression(), "Master"))));
                typeDecl.Members.Add(masterProp);
            }

            //shortcut building the existing members type map
            if (memberList.Members.Count == 0)
            {
                return(result);
            }

            var dom     = refman.TypeCtx.Compilation;
            var cls     = ReflectionHelper.ParseReflectionName(className).Resolve(dom);
            var members = GetDesignerMembers(memberList.Members.Values, cls, filename);

            //add fields for each control in the page

            foreach (var member in members)
            {
                var type = new CodeTypeReference(member.Type.FullName);
                typeDecl.Members.Add(new CodeMemberField(type, member.Name)
                {
                    Attributes = MemberAttributes.Family
                });
            }
            return(result);
        }
Пример #2
0
        public static System.CodeDom.CodeCompileUnit GenerateCodeBehind(AspNetAppProject project,
                                                                        string filename,
                                                                        AspNetParsedDocument document,
                                                                        List <CodeBehindWarning> errors)
        {
            string className = document.Info.InheritedClass;

            if (document.HasErrors)
            {
                AddFail(errors, document, document.Errors.Where(x => x.ErrorType == ErrorType.Error).First());
                return(null);
            }

            if (string.IsNullOrEmpty(className))
            {
                return(null);
            }

            var refman = new DocumentReferenceManager(project)
            {
                Doc = document
            };
            var memberList = new MemberListVisitor(document, refman);

            document.RootNode.AcceptVisit(memberList);

            var err = memberList.Errors.Where(x => x.ErrorType == ErrorType.Error).FirstOrDefault();

            if (err != null)
            {
                AddFail(errors, document, err);
                return(null);
            }

            //initialise the generated type
            var ccu      = new CodeCompileUnit();
            var namespac = new CodeNamespace();

            ccu.Namespaces.Add(namespac);
            var typeDecl = new System.CodeDom.CodeTypeDeclaration()
            {
                IsClass   = true,
                IsPartial = true,
            };

            namespac.Types.Add(typeDecl);

            //name the class and namespace
            int    namespaceSplit = className.LastIndexOf('.');
            string namespaceName  = null;

            if (namespaceSplit > -1)
            {
                namespac.Name = project.StripImplicitNamespace(className.Substring(0, namespaceSplit));
                typeDecl.Name = className.Substring(namespaceSplit + 1);
            }
            else
            {
                typeDecl.Name = className;
            }

            string masterTypeName = null;

            if (!String.IsNullOrEmpty(document.Info.MasterPageTypeName))
            {
                masterTypeName = document.Info.MasterPageTypeName;
            }
            else if (!String.IsNullOrEmpty(document.Info.MasterPageTypeVPath))
            {
                try {
                    ProjectFile          resolvedMaster       = project.ResolveVirtualPath(document.Info.MasterPageTypeVPath, document.FileName);
                    AspNetParsedDocument masterParsedDocument = null;
                    if (resolvedMaster != null)
                    {
                        masterParsedDocument = ProjectDomService.Parse(project, resolvedMaster.FilePath) as AspNetParsedDocument;
                    }
                    if (masterParsedDocument != null && !String.IsNullOrEmpty(masterParsedDocument.Info.InheritedClass))
                    {
                        masterTypeName = masterParsedDocument.Info.InheritedClass;
                    }
                    else
                    {
                        errors.Add(new CodeBehindWarning(String.Format("Could not find type for master '{0}'",
                                                                       document.Info.MasterPageTypeVPath),
                                                         document.FileName));
                    }
                } catch (Exception ex) {
                    errors.Add(new CodeBehindWarning(String.Format("Could not find type for master '{0}'",
                                                                   document.Info.MasterPageTypeVPath),
                                                     document.FileName));
                    LoggingService.LogWarning("Error resolving master page type", ex);
                }
            }

            if (masterTypeName != null)
            {
                var masterProp = new CodeMemberProperty()
                {
                    Name       = "Master",
                    Type       = new CodeTypeReference(masterTypeName),
                    HasGet     = true,
                    HasSet     = false,
                    Attributes = System.CodeDom.MemberAttributes.Public | System.CodeDom.MemberAttributes.New
                                 | System.CodeDom.MemberAttributes.Final,
                };
                masterProp.GetStatements.Add(new System.CodeDom.CodeMethodReturnStatement(
                                                 new System.CodeDom.CodeCastExpression(masterTypeName,
                                                                                       new System.CodeDom.CodePropertyReferenceExpression(
                                                                                           new System.CodeDom.CodeBaseReferenceExpression(), "Master"))));
                typeDecl.Members.Add(masterProp);
            }

            //shortcut building the existing members type map
            if (memberList.Members.Count == 0)
            {
                return(ccu);
            }

            var dom     = refman.TypeCtx.ProjectDom;
            var cls     = dom.GetType(className);
            var members = GetDesignerMembers(memberList.Members.Values, cls, filename, dom, dom);

            //add fields for each control in the page

            foreach (var member in members)
            {
                var type = new CodeTypeReference(member.Type.FullName);
                typeDecl.Members.Add(new CodeMemberField(type, member.Name)
                {
                    Attributes = MemberAttributes.Family
                });
            }
            return(ccu);
        }