UNPKG

8.47 kBSource Map (JSON)View Raw
1{"version":3,"sources":["../../src/utils/ConcreteModelConverter.js"],"names":["reportCompileError","realm","message","loc","error","CompilerDiagnostic","handleError","createEmptyFunction","concreteFunction","ECMAScriptSourceFunctionValue","$ECMAScriptCode","t","blockStatement","$FormalParameters","uniqueOrderedTag","functionBodyUniqueTagSeed","concretize","val","ConcreteValue","AbstractValue","kind","args","length","type","types","getType","isTop","UndefinedValue","prototype","PrimitiveValue","values","StringValue","NumberValue","SymbolValue","BooleanValue","NullValue","getElements","size","value","FunctionValue","ArrayValue","expressionLocation","AbstractObjectValue","ObjectValue","template","getTemplate","valIsPartial","isPartialObject","makeNotPartial","concreteObj","Create","ObjectCreate","$GetPrototypeOf","keys","P","newElement","CreateDataProperty","makePartial"],"mappings":"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","sourcesContent":["/**\n * Copyright (c) 2017-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n */\n\n/* @flow */\n\n/**\n * This file contains code that converts abstract models into concrete values.\n */\n\nimport type { Realm } from \"../realm.js\";\nimport type { BabelNodeSourceLocation } from \"@babel/types\";\nimport {\n AbstractObjectValue,\n AbstractValue,\n BooleanValue,\n ConcreteValue,\n FunctionValue,\n NullValue,\n NumberValue,\n ObjectValue,\n StringValue,\n SymbolValue,\n UndefinedValue,\n PrimitiveValue,\n ArrayValue,\n ECMAScriptSourceFunctionValue,\n Value,\n} from \"../values/index.js\";\nimport * as t from \"@babel/types\";\nimport invariant from \"../invariant.js\";\nimport type { FunctionBodyAstNode } from \"../types.js\";\nimport { CompilerDiagnostic } from \"../errors.js\";\nimport { EnumerableOwnProperties, Get } from \"../methods/index.js\";\nimport { Create } from \"../singletons.js\";\n\nfunction reportCompileError(realm: Realm, message: string, loc: ?BabelNodeSourceLocation) {\n let error = new CompilerDiagnostic(message, loc, \"PP9000\", \"RecoverableError\");\n realm.handleError(error);\n}\n\nfunction createEmptyFunction(realm: Realm) {\n const concreteFunction = new ECMAScriptSourceFunctionValue(realm);\n concreteFunction.$ECMAScriptCode = t.blockStatement([]);\n concreteFunction.$FormalParameters = [];\n ((concreteFunction.$ECMAScriptCode: any): FunctionBodyAstNode).uniqueOrderedTag = realm.functionBodyUniqueTagSeed++;\n return concreteFunction;\n}\n\n/**\n * Convert abstract model value into concrete value.\n */\nexport function concretize(realm: Realm, val: Value): ConcreteValue {\n if (val instanceof ConcreteValue) {\n return val;\n }\n invariant(val instanceof AbstractValue);\n if (val.kind === \"abstractConcreteUnion\") {\n invariant(val.args.length > 0);\n return concretize(realm, val.args[0]);\n }\n const type = val.types.getType();\n if (val.types.isTop()) {\n return new UndefinedValue(realm);\n } else if ((type: any).prototype instanceof PrimitiveValue) {\n if (val.values.isTop()) {\n switch (type) {\n case StringValue:\n return new StringValue(realm, \"__concreteModel\");\n case NumberValue:\n return new NumberValue(realm, 42);\n case SymbolValue:\n return new SymbolValue(realm, new StringValue(realm, \"__concreteModel\"));\n case BooleanValue:\n return new BooleanValue(realm, true);\n case NullValue:\n return new NullValue(realm);\n case UndefinedValue:\n return new UndefinedValue(realm);\n default:\n invariant(false, \"Not yet implemented\");\n }\n } else {\n // TODO: This was broken. Is this actually used?\n const values = val.values.getElements();\n invariant(values.size === 1, \"Concrete model should only have one value\");\n for (let value in values) {\n invariant(value instanceof ConcreteValue, \"Concrete model should only contain one concrete value\");\n return value;\n }\n invariant(false);\n }\n } else if (type === FunctionValue) {\n return createEmptyFunction(realm);\n } else if (type === ArrayValue) {\n reportCompileError(\n realm,\n \"Emitting a concrete model for abstract array value is not supported yet.\",\n val.expressionLocation\n );\n } else if (val instanceof AbstractObjectValue) {\n if (val.values.isTop()) {\n return new ObjectValue(realm);\n } else {\n let template = val.getTemplate();\n let valIsPartial = false;\n if (val.isPartialObject()) {\n valIsPartial = true;\n val.makeNotPartial();\n }\n let concreteObj = Create.ObjectCreate(realm, template.$GetPrototypeOf());\n try {\n let keys = EnumerableOwnProperties(realm, template, \"key\");\n for (let P of keys) {\n invariant(P instanceof StringValue);\n let newElement = Get(realm, template, P);\n Create.CreateDataProperty(realm, concreteObj, P, concretize(realm, newElement));\n }\n } finally {\n if (valIsPartial) {\n val.makePartial();\n }\n }\n return concreteObj;\n }\n }\n reportCompileError(\n realm,\n \"Emitting a concrete model for this abstract value is not supported yet.\",\n val.expressionLocation\n );\n // Return undefined to make flow happy.\n return new UndefinedValue(realm);\n}\n"],"file":"ConcreteModelConverter.js"}
\No newline at end of file