diff options
Diffstat (limited to 'src/lib/corelib/language/value.h')
-rw-r--r-- | src/lib/corelib/language/value.h | 90 |
1 files changed, 56 insertions, 34 deletions
diff --git a/src/lib/corelib/language/value.h b/src/lib/corelib/language/value.h index 5f6b5ca16..262813841 100644 --- a/src/lib/corelib/language/value.h +++ b/src/lib/corelib/language/value.h @@ -42,6 +42,7 @@ #include "forward_decls.h" #include <tools/codelocation.h> +#include <QtCore/qstring.h> #include <QtCore/qvariant.h> #include <vector> @@ -54,13 +55,26 @@ class ValueHandler; class Value { public: - enum Type - { + enum Type { JSSourceValueType, ItemValueType, VariantValueType }; + enum Flag { + NoFlags = 0x00, + SourceUsesBase = 0x01, + SourceUsesOuter = 0x02, + SourceUsesOriginal = 0x04, + HasFunctionForm = 0x08, + ExclusiveListValue = 0x10, + BuiltinDefaultValue = 0x20, + OriginPropertiesBlock = 0x40, + OriginProfile = 0x80, + OriginCommandLine = 0x100, + }; + Q_DECLARE_FLAGS(Flags, Flag) + Value(Type t, bool createdByPropertiesBlock); Value(const Value &other); virtual ~Value(); @@ -70,21 +84,50 @@ public: virtual ValuePtr clone() const = 0; virtual CodeLocation location() const { return {}; } - Item *definingItem() const; - virtual void setDefiningItem(Item *item); + Item *scope() const { return m_scope; } + virtual void setScope(Item *scope, const QString &scopeName); + QString scopeName() const { return m_scopeName; } + int priority(const Item *productItem) const; + virtual void resetPriority(); ValuePtr next() const; void setNext(const ValuePtr &next); - bool createdByPropertiesBlock() const { return m_createdByPropertiesBlock; } - void setCreatedByPropertiesBlock(bool b) { m_createdByPropertiesBlock = b; } - void clearCreatedByPropertiesBlock() { m_createdByPropertiesBlock = false; } + virtual void addCandidate(const ValuePtr &v) { m_candidates.push_back(v); } + const std::vector<ValuePtr> &candidates() const { return m_candidates; } + virtual void setCandidates(const std::vector<ValuePtr> &candidates) { m_candidates = candidates; } + + bool createdByPropertiesBlock() const { return m_flags & OriginPropertiesBlock; } + void markAsSetByProfile() { m_flags |= OriginProfile; } + bool setByProfile() const { return m_flags & OriginProfile; } + void markAsSetByCommandLine() { m_flags |= OriginCommandLine; } + bool setByCommandLine() const { return m_flags & OriginCommandLine; } + bool setInternally() const; + bool expired(const Item *productItem) const { return priority(productItem) == 0; } + + void setSourceUsesBase() { m_flags |= SourceUsesBase; } + bool sourceUsesBase() const { return m_flags.testFlag(SourceUsesBase); } + void setSourceUsesOuter() { m_flags |= SourceUsesOuter; } + bool sourceUsesOuter() const { return m_flags.testFlag(SourceUsesOuter); } + void setSourceUsesOriginal() { m_flags |= SourceUsesOriginal; } + bool sourceUsesOriginal() const { return m_flags.testFlag(SourceUsesOriginal); } + void setHasFunctionForm() { m_flags |= HasFunctionForm; } + bool hasFunctionForm() const { return m_flags.testFlag(HasFunctionForm); } + void setIsExclusiveListValue() { m_flags |= ExclusiveListValue; } + bool isExclusiveListValue() { return m_flags.testFlag(ExclusiveListValue); } + void setIsBuiltinDefaultValue() { m_flags |= BuiltinDefaultValue; } + bool isBuiltinDefaultValue() const { return m_flags.testFlag(BuiltinDefaultValue); } private: + int calculatePriority(const Item *productItem) const; + Type m_type; - Item *m_definingItem; + Item *m_scope = nullptr; + QString m_scopeName; ValuePtr m_next; - bool m_createdByPropertiesBlock; + std::vector<ValuePtr> m_candidates; + Flags m_flags; + mutable int m_priority = -1; }; class ValueHandler @@ -99,18 +142,6 @@ class JSSourceValue : public Value { friend class ItemReaderASTVisitor; - enum Flag - { - NoFlags = 0x00, - SourceUsesBase = 0x01, - SourceUsesOuter = 0x02, - SourceUsesOriginal = 0x04, - HasFunctionForm = 0x08, - ExclusiveListValue = 0x10, - BuiltinDefaultValue = 0x20, - }; - Q_DECLARE_FLAGS(Flags, Flag) - public: explicit JSSourceValue(bool createdByPropertiesBlock); JSSourceValue(const JSSourceValue &other); @@ -133,17 +164,6 @@ public: void setFile(const FileContextPtr &file) { m_file = file; } const FileContextPtr &file() const { return m_file; } - void setSourceUsesBaseFlag() { m_flags |= SourceUsesBase; } - bool sourceUsesBase() const { return m_flags.testFlag(SourceUsesBase); } - bool sourceUsesOuter() const { return m_flags.testFlag(SourceUsesOuter); } - bool sourceUsesOriginal() const { return m_flags.testFlag(SourceUsesOriginal); } - bool hasFunctionForm() const { return m_flags.testFlag(HasFunctionForm); } - void setHasFunctionForm(bool b); - void setIsExclusiveListValue() { m_flags |= ExclusiveListValue; } - bool isExclusiveListValue() { return m_flags.testFlag(ExclusiveListValue); } - void setIsBuiltinDefaultValue() { m_flags |= BuiltinDefaultValue; } - bool isBuiltinDefaultValue() const { return m_flags.testFlag(BuiltinDefaultValue); } - const JSSourceValuePtr &baseValue() const { return m_baseValue; } void setBaseValue(const JSSourceValuePtr &v) { m_baseValue = v; } @@ -176,14 +196,16 @@ public: void addAlternative(const Alternative &alternative) { m_alternatives.push_back(alternative); } void clearAlternatives(); - void setDefiningItem(Item *item) override; + void setScope(Item *scope, const QString &scopeName) override; + void resetPriority() override; + void addCandidate(const ValuePtr &v) override; + void setCandidates(const std::vector<ValuePtr> &candidates) override; private: QStringView m_sourceCode; int m_line; int m_column; FileContextPtr m_file; - Flags m_flags; JSSourceValuePtr m_baseValue; std::vector<Alternative> m_alternatives; }; |