/* * Build first-time intialization statements */ protected override void BuildInitStatements(CodeStatementCollection trueStatements, CodeStatementCollection topLevelStatements) { base.BuildInitStatements(trueStatements, topLevelStatements); // CodeMemberField fileDependencies = new CodeMemberField(typeof(object), fileDependenciesName); fileDependencies.Attributes |= MemberAttributes.Static; _sourceDataClass.Members.Add(fileDependencies); // Note: it may look like this local variable declaration is redundant. However it is necessary // to make this init code re-entrant safe. This way, even if two threads enter the contructor // at the same time, they will not add multiple dependencies. // e.g. string[] dependencies; CodeVariableDeclarationStatement dependencies = new CodeVariableDeclarationStatement(); dependencies.Type = new CodeTypeReference(typeof(string[])); dependencies.Name = dependenciesLocalName; // Note: it is important to add all local variables at the top level for CodeDom Subset compliance. topLevelStatements.Insert(0, dependencies); Debug.Assert(Parser.SourceDependencies != null); StringSet virtualDependencies = new StringSet(); virtualDependencies.AddCollection(Parser.SourceDependencies); // e.g. dependencies = new string[{{virtualDependencies.Count}}];; CodeAssignStatement assignDependencies = new CodeAssignStatement(); assignDependencies.Left = new CodeVariableReferenceExpression(dependenciesLocalName); assignDependencies.Right = new CodeArrayCreateExpression(typeof(String), virtualDependencies.Count); trueStatements.Add(assignDependencies); int i = 0; foreach (string virtualDependency in virtualDependencies) { // e.g. dependencies[i] = "~/sub/foo.aspx"; CodeAssignStatement addFileDep = new CodeAssignStatement(); addFileDep.Left = new CodeArrayIndexerExpression( new CodeVariableReferenceExpression(dependenciesLocalName), new CodeExpression[] {new CodePrimitiveExpression(i++)}); string src = UrlPath.MakeVirtualPathAppRelative(virtualDependency); addFileDep.Right = new CodePrimitiveExpression(src); trueStatements.Add(addFileDep); } // e.g. __fileDependencies = this.GetWrappedFileDependencies(dependencies); CodeAssignStatement initFile = new CodeAssignStatement(); initFile.Left = new CodeFieldReferenceExpression(_classTypeExpr, fileDependenciesName); CodeMethodInvokeExpression createWrap = new CodeMethodInvokeExpression(); createWrap.Method.TargetObject = new CodeThisReferenceExpression(); createWrap.Method.MethodName = "GetWrappedFileDependencies"; createWrap.Parameters.Add(new CodeVariableReferenceExpression(dependenciesLocalName)); initFile.Right = createWrap; #if DBG AppendDebugComment(trueStatements); #endif trueStatements.Add(initFile); }
protected override void BuildInitStatements(CodeStatementCollection trueStatements, CodeStatementCollection topLevelStatements) { CodeMemberField field; base.BuildInitStatements(trueStatements, topLevelStatements); field = new CodeMemberField(typeof(object), "__fileDependencies") { Attributes = field.Attributes | MemberAttributes.Static }; base._sourceDataClass.Members.Add(field); CodeVariableDeclarationStatement statement = new CodeVariableDeclarationStatement { Type = new CodeTypeReference(typeof(string[])), Name = "dependencies" }; topLevelStatements.Insert(0, statement); StringSet set = new StringSet(); set.AddCollection(this.Parser.SourceDependencies); CodeAssignStatement statement2 = new CodeAssignStatement { Left = new CodeVariableReferenceExpression("dependencies"), Right = new CodeArrayCreateExpression(typeof(string), set.Count) }; trueStatements.Add(statement2); int num = 0; foreach (string str in (IEnumerable) set) { CodeAssignStatement statement3 = new CodeAssignStatement { Left = new CodeArrayIndexerExpression(new CodeVariableReferenceExpression("dependencies"), new CodeExpression[] { new CodePrimitiveExpression(num++) }) }; string str2 = UrlPath.MakeVirtualPathAppRelative(str); statement3.Right = new CodePrimitiveExpression(str2); trueStatements.Add(statement3); } CodeAssignStatement statement4 = new CodeAssignStatement { Left = new CodeFieldReferenceExpression(base._classTypeExpr, "__fileDependencies") }; CodeMethodInvokeExpression expression = new CodeMethodInvokeExpression { Method = { TargetObject = new CodeThisReferenceExpression(), MethodName = "GetWrappedFileDependencies" } }; expression.Parameters.Add(new CodeVariableReferenceExpression("dependencies")); statement4.Right = expression; trueStatements.Add(statement4); }