blob: d89be7dfab3090990f9128c53e94485f8b3d6df9 [file] [log] [blame]
//===-- AST Locator Class ---------------------------------------*- C++ -*-===//
//
// High Level Virtual Machine (HLVM)
//
// Copyright (C) 2006 Reid Spencer. All Rights Reserved.
//
// This software is free software; you can redistribute it and/or modify it
// under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation; either version 2.1 of the License, or (at
// your option) any later version.
//
// This software is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
// more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this library in the file named LICENSE.txt; if not, write to the
// Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
// MA 02110-1301 USA
//
//===----------------------------------------------------------------------===//
/// @file hlvm/AST/Locator.h
/// @author Reid Spencer <rspencer@reidspencer.com> (original author)
/// @date 2006/05/04
/// @since 0.1.0
/// @brief Declares the class hlvm::AST::Locator and friends
//===----------------------------------------------------------------------===//
#ifndef HLVM_AST_LOCATOR_H
#define HLVM_AST_LOCATOR_H
#include <hlvm/AST/URI.h>
#include <string>
namespace hlvm
{
/// This abstract base class is the superclass of the various Locator classes
/// that are used to associate a source code location with a node in the
/// AST. Locators are not Abstract Syntax Tree nodes, but they are referenced
/// as a value of any Node subclass. These classes are retained separately from
/// the Node class so that multiple nodes can share an instance of a Locator.
/// This can occur frequently when a single line of source code produces several
/// AST operator nodes. By keeping the Locator as a separate object, the memory
/// consumption of the AST is reduced. This abstrat base class provides a single
/// virtual method, getReference, which should produce a string that identifies
/// the source code location. This will be used in error messages, etc.
/// @brief Source Code Location Abstract Base Class
class Locator
{
/// @name Constructors
protected:
Locator() : SubclassID(0) {}
virtual ~Locator();
/// @name Accessors
/// @{
public:
virtual void getLocation(std::string& ref) const = 0;
virtual uint32_t getLine() const = 0;
virtual uint32_t getColumn() const = 0;
virtual uint32_t getEndLine() const = 0;
virtual uint32_t getEndColumn() const = 0;
virtual bool equals(const Locator& that) const = 0;
bool operator==(const Locator& that) { return this->equals(that); }
unsigned short id() const { return SubclassID; }
/// @}
protected:
unsigned short SubclassID;
};
/// This Locator subclass provides a locator that specifies the location as
/// simply being some resource (URI). While this usually isn't sufficient, it
/// may be useful in some contexts and also serves as the base class of other
/// Locator classes.
/// @see Locator
/// @brief Locator that contains just a URI
class URILocator : public Locator
{
/// @name Constructors
/// @{
protected:
URILocator(const URI* u) : Locator(), uri(u) { SubclassID = 1; }
virtual ~URILocator();
/// @}
/// @name Accessors
/// @{
public:
virtual void getLocation(std::string& ref) const;
virtual uint32_t getLine() const;
virtual uint32_t getColumn() const;
virtual uint32_t getEndLine() const;
virtual uint32_t getEndColumn() const;
virtual bool equals(const Locator& that) const;
/// @}
/// @name Data
/// @{
protected:
const URI* uri;
/// @}
friend class AST;
};
/// This Locator can be used to locate a specific line within some resource. It
/// is a URILocator sublcass.
/// @see Locator
/// @brief Locator with URI (file) and line number.
class LineLocator : public URILocator
{
/// @name Constructors
/// @{
protected:
LineLocator(const URI* u, uint32_t l) : URILocator(u), line(l) {
SubclassID = 2;
}
virtual ~LineLocator();
/// @}
/// @name Accessors
/// @{
public:
virtual void getLocation(std::string& ref) const;
virtual uint32_t getLine() const;
virtual uint32_t getColumn() const;
virtual uint32_t getEndLine() const;
virtual uint32_t getEndColumn() const;
virtual bool equals(const Locator& that) const;
/// @}
/// @name Data
/// @{
protected:
uint32_t line; ///< Line number of source location
/// @}
friend class AST;
};
/// This class provides a locator that specifies a specific column on a specific
/// line of a given URI (file).
/// @brief Locator with File, Line and Column
class LineColumnLocator : public LineLocator
{
/// @name Constructors
/// @{
protected:
LineColumnLocator(const URI* u, uint32_t l, uint32_t c)
: LineLocator(u,l), col(c) { SubclassID = 3; }
virtual ~LineColumnLocator();
/// @}
/// @name Accessors
/// @{
public:
virtual void getLocation(std::string& ref) const;
virtual uint32_t getLine() const;
virtual uint32_t getColumn() const;
virtual uint32_t getEndLine() const;
virtual uint32_t getEndColumn() const;
virtual bool equals(const Locator& that) const;
/// @}
/// @name Data
/// @{
protected:
uint32_t col; ///< Column number of source location
/// @}
friend class AST;
};
/// This class provides a Locator that identifies a range of text in a source
/// location. The range is specified by a pair of Line/Column pairs. That is,
/// the range specifies a starting line and column number and an ending line and
/// column number.
/// @see Locator
/// @brief Locator for specifying a range of text in a source file.
class RangeLocator : public LineColumnLocator
{
/// @name Constructors
/// @{
protected:
RangeLocator(const URI* u, uint32_t l, uint32_t c, uint32_t l2, uint32_t c2)
: LineColumnLocator(u,l,c), line2(l2), col2(c2) { SubclassID = 4; }
virtual ~RangeLocator();
/// @}
/// @name Accessors
/// @{
public:
virtual void getLocation(std::string& ref) const;
virtual uint32_t getLine() const;
virtual uint32_t getColumn() const;
virtual uint32_t getEndLine() const;
virtual uint32_t getEndColumn() const;
virtual bool equals(const Locator& that) const;
/// @}
/// @name Data
/// @{
protected:
uint32_t line2; ///< Column number of source location
uint32_t col2; ///< Column number of source location
/// @}
friend class AST;
};
} // hlvm
#endif