view trunk/src/dil/semantic/Scope.d @ 798:c24be8d4f6ab

Added documentation comments.
author Aziz K?ksal <aziz.koeksal@gmail.com>
date Sat, 01 Mar 2008 02:53:06 +0100
parents d33895f679eb
children
line wrap: on
line source

/++
  Author: Aziz Köksal
  License: GPL3
+/
module dil.semantic.Scope;

import dil.semantic.Symbol;
import dil.semantic.Symbols;
import dil.lexer.Identifier;
import common;

/// Builds a hierarchy of environments.
class Scope
{
  Scope parent; /// The surrounding scope, or null if this is the root scope.

  ScopeSymbol symbol; /// The current symbol with the symbol table.

  this(Scope parent, ScopeSymbol symbol)
  {
    this.parent = parent;
    this.symbol = symbol;
  }

  /// Find a symbol in this scope.
  /// Params:
  ///   name = the name of the symbol.
  Symbol lookup(Identifier* name)
  {
    return symbol.lookup(name);
  }

  /// Create a new inner scope and return that.
  Scope enter(ScopeSymbol symbol)
  {
    return new Scope(this, symbol);
  }

  /// Destroy this scope and return the outer scope.
  Scope exit()
  {
    auto sc = parent;
    // delete this;
    return sc;
  }

  /// Search for the enclosing Class scope.
  Scope classScope()
  {
    auto scop = this;
    do
    {
      if (scop.symbol.isClass)
        return scop;
      scop = scop.parent;
    } while (scop)
    return null;
  }

  /// Search for the enclosing Module scope.
  Scope moduleScope()
  {
    auto scop = this;
    do
    {
      if (scop.symbol.isModule)
        return scop;
      scop = scop.parent;
    } while (scop)
    return null;
  }
}