public override void VisitPropertyDeclaration(PropertyDeclaration propertyDeclaration) { var resolveResult = _resolver.Resolve(propertyDeclaration); if (!(resolveResult is MemberResolveResult)) { _errorReporter.Region = propertyDeclaration.GetRegion(); _errorReporter.InternalError("Property declaration " + propertyDeclaration.Name + " does not resolve to a member."); return; } var property = ((MemberResolveResult)resolveResult).Member as IProperty; if (property == null) { _errorReporter.Region = propertyDeclaration.GetRegion(); _errorReporter.InternalError("Property declaration " + propertyDeclaration.Name + " does not resolve to a property (resolves to " + resolveResult.ToString() + ")"); return; } var jsClass = GetJsClass(property.DeclaringTypeDefinition); if (jsClass == null) return; var impl = _metadataImporter.GetPropertySemantics(property); switch (impl.Type) { case PropertyScriptSemantics.ImplType.GetAndSetMethods: { if (!property.IsAbstract && propertyDeclaration.Getter.Body.IsNull && propertyDeclaration.Setter.Body.IsNull) { // Auto-property if ((impl.GetMethod != null && impl.GetMethod.GenerateCode) || (impl.SetMethod != null && impl.SetMethod.GenerateCode)) { var fieldName = _metadataImporter.GetAutoPropertyBackingFieldName(property); AddDefaultFieldInitializerToType(jsClass, fieldName, property, property.ReturnType, property.DeclaringTypeDefinition, property.IsStatic); CompileAndAddAutoPropertyMethodsToType(jsClass, property, impl, fieldName); } } else { if (!propertyDeclaration.Getter.IsNull) { MaybeCompileAndAddMethodToType(jsClass, propertyDeclaration.Getter, propertyDeclaration.Getter.Body, property.Getter, impl.GetMethod); } if (!propertyDeclaration.Setter.IsNull) { MaybeCompileAndAddMethodToType(jsClass, propertyDeclaration.Setter, propertyDeclaration.Setter.Body, property.Setter, impl.SetMethod); } } break; } case PropertyScriptSemantics.ImplType.Field: { AddDefaultFieldInitializerToType(jsClass, impl.FieldName, property, property.ReturnType, property.DeclaringTypeDefinition, property.IsStatic); break; } case PropertyScriptSemantics.ImplType.NotUsableFromScript: { break; } default: { throw new InvalidOperationException("Invalid property implementation " + impl.Type); } } }
public override void VisitPropertyDeclaration(PropertyDeclaration propertyDeclaration) { var resolveResult = _resolver.Resolve(propertyDeclaration); if (!(resolveResult is MemberResolveResult)) { _errorReporter.Region = propertyDeclaration.GetRegion(); _errorReporter.InternalError("Property declaration " + propertyDeclaration.Name + " does not resolve to a member."); return; } var property = ((MemberResolveResult)resolveResult).Member as IProperty; if (property == null) { _errorReporter.Region = propertyDeclaration.GetRegion(); _errorReporter.InternalError("Property declaration " + propertyDeclaration.Name + " does not resolve to a property (resolves to " + resolveResult.ToString() + ")"); return; } var jsClass = GetJsClass(property.DeclaringTypeDefinition); if (jsClass == null) { return; } var impl = _metadataImporter.GetPropertySemantics(property); switch (impl.Type) { case PropertyScriptSemantics.ImplType.GetAndSetMethods: { if (!property.IsAbstract && propertyDeclaration.Getter.Body.IsNull && propertyDeclaration.Setter.Body.IsNull) { // Auto-property var fieldName = _metadataImporter.GetAutoPropertyBackingFieldName(property); if (_metadataImporter.ShouldGenerateAutoPropertyBackingField(property)) { AddDefaultFieldInitializerToType(jsClass, fieldName, property, property.IsStatic); } CompileAndAddAutoPropertyMethodsToType(jsClass, property, impl, fieldName); } else { if (!propertyDeclaration.Getter.IsNull) { MaybeCompileAndAddMethodToType(jsClass, propertyDeclaration.Getter, propertyDeclaration.Getter.Body, property.Getter, impl.GetMethod); } if (!propertyDeclaration.Setter.IsNull) { MaybeCompileAndAddMethodToType(jsClass, propertyDeclaration.Setter, propertyDeclaration.Setter.Body, property.Setter, impl.SetMethod); } } break; } case PropertyScriptSemantics.ImplType.Field: { AddDefaultFieldInitializerToType(jsClass, impl.FieldName, property, property.IsStatic); break; } case PropertyScriptSemantics.ImplType.NotUsableFromScript: { break; } default: { throw new InvalidOperationException("Invalid property implementation " + impl.Type); } } }