FieldDeclaration ConvertField(IField field) { FieldDeclaration decl = new FieldDeclaration(); if (ShowModifiers) { Modifiers m = GetMemberModifiers(field); if (field.IsConst) { m &= ~Modifiers.Static; m |= Modifiers.Const; } else if (field.IsReadOnly) { m |= Modifiers.Readonly; } else if (field.IsVolatile) { m |= Modifiers.Volatile; } decl.Modifiers = m; } if (ShowAttributes) { decl.Attributes.AddRange (field.Attributes.Select ((a) => new AttributeSection (ConvertAttribute (a)))); } if (AddResolveResultAnnotations) { decl.AddAnnotation(new MemberResolveResult(null, field)); } decl.ReturnType = ConvertType(field.ReturnType); Expression initializer = null; if (field.IsConst && this.ShowConstantValues) initializer = ConvertConstantValue(field.Type, field.ConstantValue); decl.Variables.Add(new VariableInitializer(field.Name, initializer)); return decl; }
void HandleStaticFieldInitializers(IEnumerable <AstNode> members) { // Convert static constructor into field initializers if the class is BeforeFieldInit var staticCtor = members.OfType <ConstructorDeclaration>().FirstOrDefault(c => (c.Modifiers & Modifiers.Static) == Modifiers.Static); if (staticCtor != null) { MethodDef ctorMethodDef = staticCtor.Annotation <MethodDef>(); if (ctorMethodDef != null && ctorMethodDef.DeclaringType.IsBeforeFieldInit) { var mm = staticCtor.Annotation <MemberMapping>() ?? staticCtor.Body.Annotation <MemberMapping>(); Debug.Assert(mm != null); while (true) { ExpressionStatement es = staticCtor.Body.Statements.FirstOrDefault() as ExpressionStatement; if (es == null) { break; } AssignmentExpression assignment = es.Expression as AssignmentExpression; if (assignment == null || assignment.Operator != AssignmentOperatorType.Assign) { break; } FieldDef fieldDef = assignment.Left.Annotation <IField>().ResolveFieldWithinSameModule(); if (fieldDef == null || !fieldDef.IsStatic) { break; } FieldDeclaration fieldDecl = members.OfType <FieldDeclaration>().FirstOrDefault(f => f.Annotation <FieldDef>() == fieldDef); if (fieldDecl == null) { break; } var ilRanges = assignment.GetAllRecursiveILRanges(); assignment.RemoveAllILRangesRecursive(); var varInit = fieldDecl.Variables.Single(); varInit.Initializer = assignment.Right.Detach(); var ctorIlRanges = new List <Tuple <MemberMapping, List <ILRange> > >(1); if (mm != null) { ctorIlRanges.Add(Tuple.Create(mm, ilRanges)); } fieldDecl.AddAnnotation(ctorIlRanges); es.Remove(); } if (context.Settings.RemoveEmptyDefaultConstructors && staticCtor.Body.Statements.Count == 0) { staticCtor.Remove(); } } } }
FieldDeclaration CreateField(FieldDefinition fieldDef) { FieldDeclaration astField = new FieldDeclaration(); astField.AddAnnotation(fieldDef); VariableInitializer initializer = new VariableInitializer(CleanName(fieldDef.Name)); astField.AddChild(initializer, FieldDeclaration.Roles.Variable); astField.ReturnType = ConvertType(fieldDef.FieldType, fieldDef); astField.Modifiers = ConvertModifiers(fieldDef); if (fieldDef.HasConstant) { if (fieldDef.Constant == null) initializer.Initializer = new NullReferenceExpression(); else initializer.Initializer = new PrimitiveExpression(fieldDef.Constant); } ConvertAttributes(astField, fieldDef); return astField; }
FieldDeclaration CreateField(FieldDefinition fieldDef) { FieldDeclaration astField = new FieldDeclaration(); astField.AddAnnotation(fieldDef); VariableInitializer initializer = new VariableInitializer(CleanName(fieldDef.Name)); astField.AddChild(initializer, FieldDeclaration.Roles.Variable); astField.ReturnType = ConvertType(fieldDef.FieldType, fieldDef); astField.Modifiers = ConvertModifiers(fieldDef); if (fieldDef.HasConstant) { if (fieldDef.Constant == null) { initializer.Initializer = new NullReferenceExpression(); } else { TypeCode c = Type.GetTypeCode(fieldDef.Constant.GetType()); if (c >= TypeCode.SByte && c <= TypeCode.UInt64 && !fieldDef.DeclaringType.IsEnum) { initializer.Initializer = MakePrimitive((long)CSharpPrimitiveCast.Cast(TypeCode.Int64, fieldDef.Constant, false), fieldDef.FieldType); } else { initializer.Initializer = new PrimitiveExpression(fieldDef.Constant); } } } ConvertAttributes(astField, fieldDef); return astField; }