Beispiel #1
0
        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);
            }
            }
        }
 public virtual bool ShouldGenerateAutoPropertyBackingField(IProperty property)
 {
     return(_prev.ShouldGenerateAutoPropertyBackingField(property));
 }