1 /**************************************************************************
3 ** This file is part of Qt Creator
5 ** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
7 ** Contact: Nokia Corporation (info@qt.nokia.com)
10 ** GNU Lesser General Public License Usage
12 ** This file may be used under the terms of the GNU Lesser General Public
13 ** License version 2.1 as published by the Free Software Foundation and
14 ** appearing in the file LICENSE.LGPL included in the packaging of this file.
15 ** Please review the following information to ensure the GNU Lesser General
16 ** Public License version 2.1 requirements will be met:
17 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
19 ** In addition, as a special exception, Nokia gives you certain additional
20 ** rights. These rights are described in the Nokia Qt LGPL Exception
21 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
25 ** Alternatively, this file may be used in accordance with the terms and
26 ** conditions contained in a signed written agreement between you and Nokia.
28 ** If you have questions regarding the use of this file, please contact
29 ** Nokia at info@qt.nokia.com.
31 **************************************************************************/
33 #ifndef QMLJS_INTERPRETER_H
34 #define QMLJS_INTERPRETER_H
36 #include <languageutils/componentversion.h>
37 #include <languageutils/fakemetaobject.h>
38 #include <qmljs/qmljsdocument.h>
39 #include <qmljs/qmljs_global.h>
40 #include <qmljs/parser/qmljsastfwd_p.h>
42 #include <QtCore/QFileInfoList>
43 #include <QtCore/QList>
44 #include <QtCore/QString>
45 #include <QtCore/QHash>
46 #include <QtCore/QSet>
47 #include <QtCore/QMutex>
54 ////////////////////////////////////////////////////////////////////////////////
55 // Forward declarations
56 ////////////////////////////////////////////////////////////////////////////////
72 class AnchorLineValue;
77 typedef QSharedPointer<const Context> ContextPtr;
78 class ReferenceContext;
79 class CppComponentValue;
82 class QmlPrototypeReference;
83 class ASTPropertyReference;
86 typedef QList<const Value *> ValueList;
88 ////////////////////////////////////////////////////////////////////////////////
90 ////////////////////////////////////////////////////////////////////////////////
91 class QMLJS_EXPORT ValueVisitor
95 virtual ~ValueVisitor();
97 virtual void visit(const NullValue *);
98 virtual void visit(const UndefinedValue *);
99 virtual void visit(const UnknownValue *);
100 virtual void visit(const NumberValue *);
101 virtual void visit(const BooleanValue *);
102 virtual void visit(const StringValue *);
103 virtual void visit(const ObjectValue *);
104 virtual void visit(const FunctionValue *);
105 virtual void visit(const Reference *);
106 virtual void visit(const ColorValue *);
107 virtual void visit(const AnchorLineValue *);
110 ////////////////////////////////////////////////////////////////////////////////
112 ////////////////////////////////////////////////////////////////////////////////
113 class QMLJS_EXPORT Value
115 Value(const Value &other);
116 void operator = (const Value &other);
122 virtual const NullValue *asNullValue() const;
123 virtual const UndefinedValue *asUndefinedValue() const;
124 virtual const UnknownValue *asUnknownValue() const;
125 virtual const NumberValue *asNumberValue() const;
126 virtual const IntValue *asIntValue() const;
127 virtual const RealValue *asRealValue() const;
128 virtual const BooleanValue *asBooleanValue() const;
129 virtual const StringValue *asStringValue() const;
130 virtual const UrlValue *asUrlValue() const;
131 virtual const ObjectValue *asObjectValue() const;
132 virtual const FunctionValue *asFunctionValue() const;
133 virtual const Reference *asReference() const;
134 virtual const ColorValue *asColorValue() const;
135 virtual const AnchorLineValue *asAnchorLineValue() const;
136 virtual const CppComponentValue *asCppComponentValue() const;
137 virtual const ASTObjectValue *asAstObjectValue() const;
138 virtual const QmlEnumValue *asQmlEnumValue() const;
139 virtual const QmlPrototypeReference *asQmlPrototypeReference() const;
140 virtual const ASTPropertyReference *asAstPropertyReference() const;
141 virtual const ASTSignal *asAstSignal() const;
143 virtual void accept(ValueVisitor *) const = 0;
145 virtual bool getSourceLocation(QString *fileName, int *line, int *column) const;
148 template <typename _RetTy> const _RetTy *value_cast(const Value *)
150 // Produce a good error message if a specialization is missing.
151 _RetTy::ERROR_MissingValueCastSpecialization();
155 template <> Q_INLINE_TEMPLATE const NullValue *value_cast(const Value *v)
157 if (v) return v->asNullValue();
161 template <> Q_INLINE_TEMPLATE const UndefinedValue *value_cast(const Value *v)
163 if (v) return v->asUndefinedValue();
167 template <> Q_INLINE_TEMPLATE const UnknownValue *value_cast(const Value *v)
169 if (v) return v->asUnknownValue();
173 template <> Q_INLINE_TEMPLATE const NumberValue *value_cast(const Value *v)
175 if (v) return v->asNumberValue();
179 template <> Q_INLINE_TEMPLATE const IntValue *value_cast(const Value *v)
181 if (v) return v->asIntValue();
185 template <> Q_INLINE_TEMPLATE const RealValue *value_cast(const Value *v)
187 if (v) return v->asRealValue();
191 template <> Q_INLINE_TEMPLATE const BooleanValue *value_cast(const Value *v)
193 if (v) return v->asBooleanValue();
197 template <> Q_INLINE_TEMPLATE const StringValue *value_cast(const Value *v)
199 if (v) return v->asStringValue();
203 template <> Q_INLINE_TEMPLATE const UrlValue *value_cast(const Value *v)
205 if (v) return v->asUrlValue();
209 template <> Q_INLINE_TEMPLATE const ObjectValue *value_cast(const Value *v)
211 if (v) return v->asObjectValue();
215 template <> Q_INLINE_TEMPLATE const FunctionValue *value_cast(const Value *v)
217 if (v) return v->asFunctionValue();
221 template <> Q_INLINE_TEMPLATE const Reference *value_cast(const Value *v)
223 if (v) return v->asReference();
227 template <> Q_INLINE_TEMPLATE const ColorValue *value_cast(const Value *v)
229 if (v) return v->asColorValue();
233 template <> Q_INLINE_TEMPLATE const AnchorLineValue *value_cast(const Value *v)
235 if (v) return v->asAnchorLineValue();
239 template <> Q_INLINE_TEMPLATE const CppComponentValue *value_cast(const Value *v)
241 if (v) return v->asCppComponentValue();
245 template <> Q_INLINE_TEMPLATE const ASTObjectValue *value_cast(const Value *v)
247 if (v) return v->asAstObjectValue();
251 template <> Q_INLINE_TEMPLATE const QmlEnumValue *value_cast(const Value *v)
253 if (v) return v->asQmlEnumValue();
257 template <> Q_INLINE_TEMPLATE const QmlPrototypeReference *value_cast(const Value *v)
259 if (v) return v->asQmlPrototypeReference();
263 template <> Q_INLINE_TEMPLATE const ASTPropertyReference *value_cast(const Value *v)
265 if (v) return v->asAstPropertyReference();
269 template <> Q_INLINE_TEMPLATE const ASTSignal *value_cast(const Value *v)
271 if (v) return v->asAstSignal();
275 ////////////////////////////////////////////////////////////////////////////////
277 ////////////////////////////////////////////////////////////////////////////////
278 class QMLJS_EXPORT NullValue: public Value
281 virtual const NullValue *asNullValue() const;
282 virtual void accept(ValueVisitor *visitor) const;
285 class QMLJS_EXPORT UndefinedValue: public Value
288 virtual const UndefinedValue *asUndefinedValue() const;
289 virtual void accept(ValueVisitor *visitor) const;
292 class QMLJS_EXPORT UnknownValue: public Value
295 virtual const UnknownValue *asUnknownValue() const;
296 virtual void accept(ValueVisitor *) const;
299 class QMLJS_EXPORT NumberValue: public Value
302 virtual const NumberValue *asNumberValue() const;
303 virtual void accept(ValueVisitor *visitor) const;
306 class QMLJS_EXPORT RealValue: public NumberValue
309 virtual const RealValue *asRealValue() const;
312 class QMLJS_EXPORT IntValue: public NumberValue
315 virtual const IntValue *asIntValue() const;
318 class QMLJS_EXPORT BooleanValue: public Value
321 virtual const BooleanValue *asBooleanValue() const;
322 virtual void accept(ValueVisitor *visitor) const;
325 class QMLJS_EXPORT StringValue: public Value
328 virtual const StringValue *asStringValue() const;
329 virtual void accept(ValueVisitor *visitor) const;
332 class QMLJS_EXPORT UrlValue: public StringValue
335 virtual const UrlValue *asUrlValue() const;
338 class QMLJS_EXPORT MemberProcessor
340 MemberProcessor(const MemberProcessor &other);
341 void operator = (const MemberProcessor &other);
345 virtual ~MemberProcessor();
347 // Returns false to stop the processor.
348 virtual bool processProperty(const QString &name, const Value *value);
349 virtual bool processEnumerator(const QString &name, const Value *value);
350 virtual bool processSignal(const QString &name, const Value *value);
351 virtual bool processSlot(const QString &name, const Value *value);
352 virtual bool processGeneratedSlot(const QString &name, const Value *value);
355 class QMLJS_EXPORT Reference: public Value
358 Reference(ValueOwner *valueOwner);
359 virtual ~Reference();
361 ValueOwner *valueOwner() const;
364 virtual const Reference *asReference() const;
365 virtual void accept(ValueVisitor *) const;
368 virtual const Value *value(ReferenceContext *referenceContext) const;
370 ValueOwner *_valueOwner;
371 friend class ReferenceContext;
374 class QMLJS_EXPORT ColorValue: public Value
378 virtual const ColorValue *asColorValue() const;
379 virtual void accept(ValueVisitor *) const;
382 class QMLJS_EXPORT AnchorLineValue: public Value
386 virtual const AnchorLineValue *asAnchorLineValue() const;
387 virtual void accept(ValueVisitor *) const;
390 class QMLJS_EXPORT ObjectValue: public Value
393 ObjectValue(ValueOwner *valueOwner);
394 virtual ~ObjectValue();
396 ValueOwner *valueOwner() const;
398 QString className() const;
399 void setClassName(const QString &className);
401 // may return a reference, prototypes may form a cycle: use PrototypeIterator!
402 const Value *prototype() const;
403 // prototypes may form a cycle: use PrototypeIterator!
404 const ObjectValue *prototype(const Context *context) const;
405 const ObjectValue *prototype(const ContextPtr &context) const
406 { return prototype(context.data()); }
407 void setPrototype(const Value *prototype);
409 virtual void processMembers(MemberProcessor *processor) const;
411 virtual void setMember(const QString &name, const Value *value);
412 virtual void removeMember(const QString &name);
414 virtual const Value *lookupMember(const QString &name, const Context *context,
415 const ObjectValue **foundInObject = 0,
416 bool examinePrototypes = true) const;
417 const Value *lookupMember(const QString &name, const ContextPtr &context,
418 const ObjectValue **foundInObject = 0,
419 bool examinePrototypes = true) const
420 { return lookupMember(name, context.data(), foundInObject, examinePrototypes); }
423 virtual const ObjectValue *asObjectValue() const;
424 virtual void accept(ValueVisitor *visitor) const;
427 bool checkPrototype(const ObjectValue *prototype, QSet<const ObjectValue *> *processed) const;
430 ValueOwner *_valueOwner;
431 QHash<QString, const Value *> _members;
435 const Value *_prototype;
438 class QMLJS_EXPORT PrototypeIterator
444 ReferenceResolutionError,
448 PrototypeIterator(const ObjectValue *start, const Context *context);
449 PrototypeIterator(const ObjectValue *start, const ContextPtr &context);
452 const ObjectValue *peekNext();
453 const ObjectValue *next();
456 QList<const ObjectValue *> all();
459 const ObjectValue *m_current;
460 const ObjectValue *m_next;
461 QList<const ObjectValue *> m_prototypes;
462 const Context *m_context;
466 class QMLJS_EXPORT QmlEnumValue: public NumberValue
469 QmlEnumValue(const CppComponentValue *owner, int index);
470 virtual ~QmlEnumValue();
472 virtual const QmlEnumValue *asQmlEnumValue() const;
474 QString name() const;
475 QStringList keys() const;
476 const CppComponentValue *owner() const;
479 const CppComponentValue *_owner;
484 // A ObjectValue based on a FakeMetaObject.
485 // May only have other CppComponentValue as ancestors.
486 class QMLJS_EXPORT CppComponentValue: public ObjectValue
489 CppComponentValue(LanguageUtils::FakeMetaObject::ConstPtr metaObject, const QString &className,
490 const QString &moduleName, const LanguageUtils::ComponentVersion &componentVersion,
491 const LanguageUtils::ComponentVersion &importVersion, int metaObjectRevision,
492 ValueOwner *valueOwner);
493 virtual ~CppComponentValue();
495 virtual const CppComponentValue *asCppComponentValue() const;
497 virtual void processMembers(MemberProcessor *processor) const;
498 const Value *valueForCppName(const QString &typeName) const;
500 using ObjectValue::prototype;
501 const CppComponentValue *prototype() const;
503 const CppComponentValue *attachedType() const;
504 void setAttachedType(CppComponentValue *value);
506 LanguageUtils::FakeMetaObject::ConstPtr metaObject() const;
508 QString moduleName() const;
509 LanguageUtils::ComponentVersion componentVersion() const;
510 LanguageUtils::ComponentVersion importVersion() const;
512 QString defaultPropertyName() const;
513 QString propertyType(const QString &propertyName) const;
514 bool isListProperty(const QString &name) const;
515 bool isWritable(const QString &propertyName) const;
516 bool isPointer(const QString &propertyName) const;
517 bool hasLocalProperty(const QString &typeName) const;
518 bool hasProperty(const QString &typeName) const;
520 LanguageUtils::FakeMetaEnum getEnum(const QString &typeName, const CppComponentValue **foundInScope = 0) const;
521 const QmlEnumValue *getEnumValue(const QString &typeName, const CppComponentValue **foundInScope = 0) const;
523 const ObjectValue *signalScope(const QString &signalName) const;
525 bool isDerivedFrom(LanguageUtils::FakeMetaObject::ConstPtr base) const;
528 CppComponentValue *_attachedType;
529 LanguageUtils::FakeMetaObject::ConstPtr _metaObject;
530 const QString _moduleName;
531 // _componentVersion is the version of the export
532 // _importVersion is the version it's imported as, used to find correct prototypes
533 // needed in cases when B 1.0 has A 1.1 as prototype when imported as 1.1
534 const LanguageUtils::ComponentVersion _componentVersion;
535 const LanguageUtils::ComponentVersion _importVersion;
536 mutable QAtomicPointer< QList<const Value *> > _metaSignatures;
537 mutable QAtomicPointer< QHash<QString, const ObjectValue *> > _signalScopes;
538 QHash<QString, const QmlEnumValue * > _enums;
539 int _metaObjectRevision;
542 class QMLJS_EXPORT Activation
545 explicit Activation(Context *parentContext = 0);
546 virtual ~Activation();
548 Context *context() const;
549 Context *parentContext() const;
551 bool calledAsConstructor() const;
552 void setCalledAsConstructor(bool calledAsConstructor);
554 bool calledAsFunction() const;
555 void setCalledAsFunction(bool calledAsFunction);
557 ObjectValue *thisObject() const;
558 void setThisObject(ObjectValue *thisObject);
560 ValueList arguments() const;
561 void setArguments(const ValueList &arguments);
564 ObjectValue *_thisObject;
565 ValueList _arguments;
566 bool _calledAsFunction;
567 Context *_parentContext;
571 class QMLJS_EXPORT FunctionValue: public ObjectValue
574 FunctionValue(ValueOwner *valueOwner);
575 virtual ~FunctionValue();
578 const Value *construct(const ValueList &actuals = ValueList()) const;
581 const Value *call(const ValueList &actuals = ValueList()) const;
583 const Value *call(const ObjectValue *thisObject,
584 const ValueList &actuals = ValueList()) const;
587 virtual const Value *returnValue() const;
589 virtual int argumentCount() const;
590 virtual const Value *argument(int index) const;
591 virtual QString argumentName(int index) const;
592 virtual bool isVariadic() const;
594 virtual const Value *invoke(const Activation *activation) const;
597 virtual const FunctionValue *asFunctionValue() const;
598 virtual void accept(ValueVisitor *visitor) const;
601 class QMLJS_EXPORT Function: public FunctionValue
604 Function(ValueOwner *valueOwner);
607 void addArgument(const Value *argument, const QString &name = QString());
608 void setReturnValue(const Value *returnValue);
610 // FunctionValue interface
611 virtual const Value *returnValue() const;
612 virtual int argumentCount() const;
613 virtual const Value *argument(int index) const;
614 virtual QString argumentName(int index) const;
615 virtual const Value *invoke(const Activation *activation) const;
618 ValueList _arguments;
619 QStringList _argumentNames;
620 const Value *_returnValue;
624 ////////////////////////////////////////////////////////////////////////////////
625 // typing environment
626 ////////////////////////////////////////////////////////////////////////////////
628 class QMLJS_EXPORT CppQmlTypesLoader
631 typedef QHash<QString, LanguageUtils::FakeMetaObject::ConstPtr> BuiltinObjects;
633 /** Loads a set of qmltypes files into the builtin objects list
634 and returns errors and warnings
636 static BuiltinObjects loadQmlTypes(const QFileInfoList &qmltypesFiles,
637 QStringList *errors, QStringList *warnings);
639 static BuiltinObjects defaultQtObjects;
640 static BuiltinObjects defaultLibraryObjects;
642 // parses the contents of a qmltypes file and fills the newObjects map
643 static void parseQmlTypeDescriptions(
644 const QByteArray &qmlTypes,
645 BuiltinObjects *newObjects,
646 QList<ModuleApiInfo> *newModuleApis, QString *errorMessage, QString *warningMessage);
649 class QMLJS_EXPORT CppQmlTypes
652 CppQmlTypes(ValueOwner *valueOwner);
654 // package name for objects that should be always available
655 static const QLatin1String defaultPackage;
656 // package name for objects with their raw cpp name
657 static const QLatin1String cppPackage;
659 template <typename T>
660 void load(const T &fakeMetaObjects, const QString &overridePackage = QString());
662 QList<const CppComponentValue *> createObjectsForImport(const QString &package, LanguageUtils::ComponentVersion version);
663 bool hasModule(const QString &module) const;
665 static QString qualifiedName(const QString &module, const QString &type,
666 LanguageUtils::ComponentVersion version);
667 const CppComponentValue *objectByQualifiedName(const QString &fullyQualifiedName) const;
668 const CppComponentValue *objectByQualifiedName(
669 const QString &package, const QString &type,
670 LanguageUtils::ComponentVersion version) const;
671 const CppComponentValue *objectByCppName(const QString &cppName) const;
674 // "Package.CppName ImportVersion" -> CppComponentValue
675 QHash<QString, const CppComponentValue *> _objectsByQualifiedName;
676 QHash<QString, QSet<LanguageUtils::FakeMetaObject::ConstPtr> > _fakeMetaObjectsByPackage;
677 ValueOwner *_valueOwner;
680 class ConvertToNumber: protected ValueVisitor // ECMAScript ToInt()
683 ConvertToNumber(ValueOwner *valueOwner);
685 const Value *operator()(const Value *value);
688 const Value *switchResult(const Value *value);
690 virtual void visit(const NullValue *);
691 virtual void visit(const UndefinedValue *);
692 virtual void visit(const NumberValue *);
693 virtual void visit(const BooleanValue *);
694 virtual void visit(const StringValue *);
695 virtual void visit(const ObjectValue *);
696 virtual void visit(const FunctionValue *);
699 ValueOwner *_valueOwner;
700 const Value *_result;
703 class ConvertToString: protected ValueVisitor // ECMAScript ToString
706 ConvertToString(ValueOwner *valueOwner);
708 const Value *operator()(const Value *value);
711 const Value *switchResult(const Value *value);
713 virtual void visit(const NullValue *);
714 virtual void visit(const UndefinedValue *);
715 virtual void visit(const NumberValue *);
716 virtual void visit(const BooleanValue *);
717 virtual void visit(const StringValue *);
718 virtual void visit(const ObjectValue *);
719 virtual void visit(const FunctionValue *);
722 ValueOwner *_valueOwner;
723 const Value *_result;
726 class ConvertToObject: protected ValueVisitor // ECMAScript ToObject
729 ConvertToObject(ValueOwner *valueOwner);
731 const Value *operator()(const Value *value);
734 const Value *switchResult(const Value *value);
736 virtual void visit(const NullValue *);
737 virtual void visit(const UndefinedValue *);
738 virtual void visit(const NumberValue *);
739 virtual void visit(const BooleanValue *);
740 virtual void visit(const StringValue *);
741 virtual void visit(const ObjectValue *);
742 virtual void visit(const FunctionValue *);
745 ValueOwner *_valueOwner;
746 const Value *_result;
749 class QMLJS_EXPORT TypeId: protected ValueVisitor
754 QString operator()(const Value *value);
757 virtual void visit(const NullValue *);
758 virtual void visit(const UndefinedValue *);
759 virtual void visit(const NumberValue *);
760 virtual void visit(const BooleanValue *);
761 virtual void visit(const StringValue *);
762 virtual void visit(const ObjectValue *object);
763 virtual void visit(const FunctionValue *object);
764 virtual void visit(const ColorValue *);
765 virtual void visit(const AnchorLineValue *);
769 class QMLJS_EXPORT QmlPrototypeReference: public Reference
772 QmlPrototypeReference(AST::UiQualifiedId *qmlTypeName, const Document *doc, ValueOwner *valueOwner);
773 virtual ~QmlPrototypeReference();
775 virtual const QmlPrototypeReference *asQmlPrototypeReference() const;
777 AST::UiQualifiedId *qmlTypeName() const;
780 virtual const Value *value(ReferenceContext *referenceContext) const;
782 AST::UiQualifiedId *_qmlTypeName;
783 const Document *_doc;
786 class QMLJS_EXPORT ASTVariableReference: public Reference
788 AST::VariableDeclaration *_ast;
789 const Document *_doc;
792 ASTVariableReference(AST::VariableDeclaration *ast, const Document *doc, ValueOwner *valueOwner);
793 virtual ~ASTVariableReference();
796 virtual const Value *value(ReferenceContext *referenceContext) const;
797 virtual bool getSourceLocation(QString *fileName, int *line, int *column) const;
800 class QMLJS_EXPORT ASTFunctionValue: public FunctionValue
802 AST::FunctionExpression *_ast;
803 const Document *_doc;
804 QList<QString> _argumentNames;
807 ASTFunctionValue(AST::FunctionExpression *ast, const Document *doc, ValueOwner *valueOwner);
808 virtual ~ASTFunctionValue();
810 AST::FunctionExpression *ast() const;
812 virtual int argumentCount() const;
813 virtual QString argumentName(int index) const;
815 virtual bool getSourceLocation(QString *fileName, int *line, int *column) const;
818 class QMLJS_EXPORT ASTPropertyReference: public Reference
820 AST::UiPublicMember *_ast;
821 const Document *_doc;
822 QString _onChangedSlotName;
825 ASTPropertyReference(AST::UiPublicMember *ast, const Document *doc, ValueOwner *valueOwner);
826 virtual ~ASTPropertyReference();
828 virtual const ASTPropertyReference *asAstPropertyReference() const;
830 AST::UiPublicMember *ast() const { return _ast; }
831 QString onChangedSlotName() const { return _onChangedSlotName; }
833 virtual bool getSourceLocation(QString *fileName, int *line, int *column) const;
836 virtual const Value *value(ReferenceContext *referenceContext) const;
839 class QMLJS_EXPORT ASTSignal: public FunctionValue
841 AST::UiPublicMember *_ast;
842 const Document *_doc;
844 const ObjectValue *_bodyScope;
847 ASTSignal(AST::UiPublicMember *ast, const Document *doc, ValueOwner *valueOwner);
848 virtual ~ASTSignal();
850 virtual const ASTSignal *asAstSignal() const;
852 AST::UiPublicMember *ast() const { return _ast; }
853 QString slotName() const { return _slotName; }
854 const ObjectValue *bodyScope() const { return _bodyScope; }
856 // FunctionValue interface
857 virtual int argumentCount() const;
858 virtual const Value *argument(int index) const;
859 virtual QString argumentName(int index) const;
862 virtual bool getSourceLocation(QString *fileName, int *line, int *column) const;
865 class QMLJS_EXPORT ASTObjectValue: public ObjectValue
867 AST::UiQualifiedId *_typeName;
868 AST::UiObjectInitializer *_initializer;
869 const Document *_doc;
870 QList<ASTPropertyReference *> _properties;
871 QList<ASTSignal *> _signals;
872 ASTPropertyReference *_defaultPropertyRef;
875 ASTObjectValue(AST::UiQualifiedId *typeName,
876 AST::UiObjectInitializer *initializer,
878 ValueOwner *valueOwner);
879 virtual ~ASTObjectValue();
881 virtual const ASTObjectValue *asAstObjectValue() const;
883 bool getSourceLocation(QString *fileName, int *line, int *column) const;
884 virtual void processMembers(MemberProcessor *processor) const;
886 QString defaultPropertyName() const;
888 AST::UiObjectInitializer *initializer() const;
889 AST::UiQualifiedId *typeName() const;
890 const Document *document() const;
893 class QMLJS_EXPORT ImportInfo
898 ImplicitDirectoryImport,
902 UnknownFileImport // refers a file/directory that wasn't found
907 static ImportInfo moduleImport(QString uri, LanguageUtils::ComponentVersion version,
908 const QString &as, AST::UiImport *ast = 0);
909 static ImportInfo pathImport(const QString &docPath, const QString &path,
910 LanguageUtils::ComponentVersion version,
911 const QString &as, AST::UiImport *ast = 0);
912 static ImportInfo invalidImport(AST::UiImport *ast = 0);
913 static ImportInfo implicitDirectoryImport(const QString &directory);
915 bool isValid() const;
918 // LibraryImport: uri with ',' separator
919 // Other: non-absolute path
920 QString name() const;
922 // LibraryImport: uri with QDir::separator separator
923 // Other: absoluteFilePath
924 QString path() const;
926 // null if the import has no 'as', otherwise the target id
929 LanguageUtils::ComponentVersion version() const;
930 AST::UiImport *ast() const;
936 LanguageUtils::ComponentVersion _version;
941 class QMLJS_EXPORT Import {
948 // uri imports: path to library, else empty
950 // whether the import succeeded
956 class QMLJS_EXPORT TypeScope: public ObjectValue
959 TypeScope(const Imports *imports, ValueOwner *valueOwner);
961 virtual const Value *lookupMember(const QString &name, const Context *context,
962 const ObjectValue **foundInObject = 0,
963 bool examinePrototypes = true) const;
964 virtual void processMembers(MemberProcessor *processor) const;
967 const Imports *_imports;
970 class QMLJS_EXPORT JSImportScope: public ObjectValue
973 JSImportScope(const Imports *imports, ValueOwner *valueOwner);
975 virtual const Value *lookupMember(const QString &name, const Context *context,
976 const ObjectValue **foundInObject = 0,
977 bool examinePrototypes = true) const;
978 virtual void processMembers(MemberProcessor *processor) const;
981 const Imports *_imports;
984 class QMLJS_EXPORT Imports
987 Imports(ValueOwner *valueOwner);
989 void append(const Import &import);
990 void setImportFailed();
992 ImportInfo info(const QString &name, const Context *context) const;
993 QString nameForImportedObject(const ObjectValue *value, const Context *context) const;
994 bool importFailed() const;
996 QList<Import> all() const;
998 const TypeScope *typeScope() const;
999 const JSImportScope *jsImportScope() const;
1006 // holds imports in the order they appeared,
1007 // lookup order is back to front
1008 QList<Import> _imports;
1009 TypeScope *_typeScope;
1010 JSImportScope *_jsImportScope;
1014 } // namespace QmlJS
1016 #endif // QMLJS_INTERPRETER_H