public JsExpression TypeIs(JsExpression expression, IType sourceType, IType targetType, IRuntimeContext context)
        {
            var importedCheck = CompileImportedTypeCheckCode(targetType, ref expression, context, true);

            if (importedCheck != null)
            {
                return(importedCheck);
            }

            var def = targetType.GetDefinition();

            if (def != null && (!MetadataUtils.DoesTypeObeyTypeSystem(def) || (MetadataUtils.IsSerializable(def) && string.IsNullOrEmpty(MetadataUtils.GetSerializableTypeCheckCode(def)))))
            {
                _errorReporter.Message(Messages._7701, targetType.FullName);
                return(JsExpression.Null);
            }

            var jsTarget = GetCastTarget(sourceType, targetType, context);

            if (jsTarget == null || IsSystemObjectReference(jsTarget))
            {
                return(ReferenceNotEquals(expression, JsExpression.Null, context));
            }
            return(JsExpression.Invocation(JsExpression.Member(CreateTypeReferenceExpression(_systemScript), "isInstanceOfType"), expression, jsTarget));
        }
 private JsExpression GetTypeDefinitionScriptType(ITypeDefinition type, TypeContext context)
 {
     if (context != TypeContext.GetScriptType && context != TypeContext.TypeOf && !MetadataUtils.DoesTypeObeyTypeSystem(type))
     {
         return(CreateTypeReferenceExpression(KnownTypeReference.Object));
     }
     else if (MetadataUtils.IsSerializable(type) && !MetadataUtils.DoesTypeObeyTypeSystem(type))
     {
         return(CreateTypeReferenceExpression(KnownTypeReference.Object));
     }
     else
     {
         return(CreateTypeReferenceExpression(type));
     }
 }
        public JsExpression TryDowncast(JsExpression expression, IType sourceType, IType targetType, IRuntimeContext context)
        {
            JsExpression jsTarget = CompileImportedTypeCheckCode(targetType, ref expression, context, false);

            if (jsTarget == null)
            {
                var def = targetType.GetDefinition();
                if (def != null && (!MetadataUtils.DoesTypeObeyTypeSystem(def) || (MetadataUtils.IsSerializable(def) && string.IsNullOrEmpty(MetadataUtils.GetSerializableTypeCheckCode(def)))))
                {
                    _errorReporter.Message(Messages._7702, targetType.FullName);
                    return(JsExpression.Null);
                }

                jsTarget = GetCastTarget(sourceType, targetType, context);
            }

            if (jsTarget == null || IsSystemObjectReference(jsTarget))
            {
                return(expression);
            }

            return(JsExpression.Invocation(JsExpression.Member(CreateTypeReferenceExpression(_systemScript), "safeCast"), expression, jsTarget));
        }
Пример #4
0
        private JsExpression GetTypeDefinitionScriptType(ITypeDefinition type, TypeContext context)
        {
            var sem = _metadataImporter.GetTypeSemantics(type);

            if (sem.Type == TypeScriptSemantics.ImplType.NotUsableFromScript)
            {
                _errorReporter.Message(Saltarelle.Compiler.Messages._7522, type.FullName);
                return(JsExpression.Null);
            }

            if (context != TypeContext.GetScriptType && context != TypeContext.TypeOf && !MetadataUtils.DoesTypeObeyTypeSystem(type, _attributeStore))
            {
                return(CreateTypeReferenceExpression(KnownTypeReference.Object));
            }
            else if (MetadataUtils.IsSerializable(type, _attributeStore) && !MetadataUtils.DoesTypeObeyTypeSystem(type, _attributeStore))
            {
                return(CreateTypeReferenceExpression(KnownTypeReference.Object));
            }
            else
            {
                return(CreateTypeReferenceExpression(type));
            }
        }
Пример #5
0
        private JsExpression GetCastTarget(IType type, IRuntimeContext context)
        {
            if (type.Kind == TypeKind.Enum)
            {
                return(CreateTypeReferenceExpression(type.GetDefinition().EnumUnderlyingType.GetDefinition()));
            }

            var def = type.GetDefinition();

            if (def != null)
            {
                if (MetadataUtils.IsSerializable(def) && string.IsNullOrEmpty(MetadataUtils.GetSerializableTypeCheckCode(def)))
                {
                    return(null);
                }
                if (!MetadataUtils.DoesTypeObeyTypeSystem(def))
                {
                    return(null);
                }
            }

            return(GetScriptType(type, TypeContext.GetScriptType, context));
        }
Пример #6
0
        private JsExpression GetCastTarget(IType type, IRuntimeContext context)
        {
            var def = type.GetDefinition();

            if (type.Kind == TypeKind.Enum)
            {
                var underlying = MetadataUtils.IsNamedValues(def, _attributeStore) ? _compilation.FindType(KnownTypeCode.String) : def.EnumUnderlyingType;
                return(CreateTypeReferenceExpression(underlying.GetDefinition()));
            }

            if (def != null)
            {
                if (MetadataUtils.IsSerializable(def, _attributeStore) && string.IsNullOrEmpty(MetadataUtils.GetSerializableTypeCheckCode(def, _attributeStore)))
                {
                    return(null);
                }
                if (!MetadataUtils.DoesTypeObeyTypeSystem(def, _attributeStore))
                {
                    return(null);
                }
            }

            return(GetScriptType(type, TypeContext.GetScriptType, context));
        }
Пример #7
0
 private IEnumerable <JsExpression> GetImplementedInterfaces(ITypeDefinition type)
 {
     return(type.GetAllBaseTypes().Where(t => t.Kind == TypeKind.Interface && !t.Equals(type) && MetadataUtils.DoesTypeObeyTypeSystem(t.GetDefinition())).Select(t => _runtimeLibrary.InstantiateType(t, new DefaultRuntimeContext(type, _metadataImporter, _errorReporter, _namer))));
 }