X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/9dae56ea45a0f5f8136a5c93d6f3a7f99399ca73..8b637bb680022adfddad653280734877951535a9:/parser/SourceCode.h diff --git a/parser/SourceCode.h b/parser/SourceCode.h index 84360b8..f221f92 100644 --- a/parser/SourceCode.h +++ b/parser/SourceCode.h @@ -37,53 +37,91 @@ namespace JSC { class SourceCode { public: SourceCode() - : m_startChar(0) + : m_provider(0) + , m_startChar(0) , m_endChar(0) , m_firstLine(0) + , m_startColumn(0) + { + } + + SourceCode(WTF::HashTableDeletedValueType) + : m_provider(WTF::HashTableDeletedValue) + { + } + + SourceCode(PassRefPtr provider) + : m_provider(provider) + , m_startChar(0) + , m_endChar(m_provider->source().length()) + , m_firstLine(1) + , m_startColumn(1) { } - SourceCode(PassRefPtr provider, int firstLine = 1) + SourceCode(PassRefPtr provider, int firstLine, int startColumn) : m_provider(provider) , m_startChar(0) - , m_endChar(m_provider->length()) + , m_endChar(m_provider->source().length()) , m_firstLine(std::max(firstLine, 1)) + , m_startColumn(std::max(startColumn, 1)) { } - SourceCode(PassRefPtr provider, int start, int end, int firstLine) + SourceCode(PassRefPtr provider, int start, int end, int firstLine, int startColumn) : m_provider(provider) , m_startChar(start) , m_endChar(end) , m_firstLine(std::max(firstLine, 1)) + , m_startColumn(std::max(startColumn, 1)) { } - UString toString() const + bool isHashTableDeletedValue() const { return m_provider.isHashTableDeletedValue(); } + + String toString() const { if (!m_provider) - return UString(); + return String(); return m_provider->getRange(m_startChar, m_endChar); } + intptr_t providerID() const + { + if (!m_provider) + return SourceProvider::nullID; + return m_provider->asID(); + } + bool isNull() const { return !m_provider; } SourceProvider* provider() const { return m_provider.get(); } int firstLine() const { return m_firstLine; } + int startColumn() const { return m_startColumn; } int startOffset() const { return m_startChar; } int endOffset() const { return m_endChar; } - const UChar* data() const { return m_provider->data() + m_startChar; } int length() const { return m_endChar - m_startChar; } + + SourceCode subExpression(unsigned openBrace, unsigned closeBrace, int firstLine, int startColumn); private: RefPtr m_provider; int m_startChar; int m_endChar; int m_firstLine; + int m_startColumn; }; - inline SourceCode makeSource(const UString& source, const UString& url = UString(), int firstLine = 1) + inline SourceCode makeSource(const String& source, const String& url = String(), const TextPosition& startPosition = TextPosition::minimumPosition()) + { + return SourceCode(StringSourceProvider::create(source, url, startPosition), startPosition.m_line.oneBasedInt(), startPosition.m_column.oneBasedInt()); + } + + inline SourceCode SourceCode::subExpression(unsigned openBrace, unsigned closeBrace, int firstLine, int startColumn) { - return SourceCode(UStringSourceProvider::create(source, url), firstLine); + ASSERT(provider()->source()[openBrace] == '{'); + ASSERT(provider()->source()[closeBrace] == '}'); + startColumn += 1; // Convert to base 1. + return SourceCode(provider(), openBrace, closeBrace + 1, firstLine, startColumn); } } // namespace JSC