Home | History | Annotate | Download | only in parser
      1 /*
      2  * Copyright (C) 2008 Apple Inc. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  *
      8  * 1.  Redistributions of source code must retain the above copyright
      9  *     notice, this list of conditions and the following disclaimer.
     10  * 2.  Redistributions in binary form must reproduce the above copyright
     11  *     notice, this list of conditions and the following disclaimer in the
     12  *     documentation and/or other materials provided with the distribution.
     13  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
     14  *     its contributors may be used to endorse or promote products derived
     15  *     from this software without specific prior written permission.
     16  *
     17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
     18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     20  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
     21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
     24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27  */
     28 
     29 #ifndef SourceCode_h
     30 #define SourceCode_h
     31 
     32 #include "SourceProvider.h"
     33 #include <wtf/RefPtr.h>
     34 
     35 namespace JSC {
     36 
     37     class SourceCode {
     38     public:
     39         SourceCode()
     40             : m_provider(0)
     41             , m_startChar(0)
     42             , m_endChar(0)
     43             , m_firstLine(0)
     44         {
     45         }
     46 
     47         SourceCode(PassRefPtr<SourceProvider> provider, int firstLine = 1)
     48             : m_provider(provider)
     49             , m_startChar(0)
     50             , m_endChar(m_provider->length())
     51             , m_firstLine(std::max(firstLine, 1))
     52         {
     53         }
     54 
     55         SourceCode(PassRefPtr<SourceProvider> provider, int start, int end, int firstLine)
     56             : m_provider(provider)
     57             , m_startChar(start)
     58             , m_endChar(end)
     59             , m_firstLine(std::max(firstLine, 1))
     60         {
     61         }
     62 
     63         UString toString() const
     64         {
     65             if (!m_provider)
     66                 return UString();
     67             return m_provider->getRange(m_startChar, m_endChar);
     68         }
     69 
     70         bool isNull() const { return !m_provider; }
     71         SourceProvider* provider() const { return m_provider.get(); }
     72         int firstLine() const { return m_firstLine; }
     73         int startOffset() const { return m_startChar; }
     74         int endOffset() const { return m_endChar; }
     75         const UChar* data() const { return m_provider->data() + m_startChar; }
     76         int length() const { return m_endChar - m_startChar; }
     77 
     78     private:
     79         RefPtr<SourceProvider> m_provider;
     80         int m_startChar;
     81         int m_endChar;
     82         int m_firstLine;
     83     };
     84 
     85     inline SourceCode makeSource(const UString& source, const UString& url = UString(), int firstLine = 1)
     86     {
     87         return SourceCode(UStringSourceProvider::create(source, url), firstLine);
     88     }
     89 
     90 } // namespace JSC
     91 
     92 #endif // SourceCode_h
     93