@Override
  public void resolve(Compiler compiler, FunctionSymbol currentFunction) {
    super.resolve(compiler, currentFunction);

    ObjectSymbol definingObject = getDefiningObject();
    if (eventTargetName.equals(definingObject.getName())) {
      // Class initialization event handlers
      if (eventName.equals("Load")) {
        definingObject.setObjectLoadEventHandler(this);
        return;
      } else if (eventName.equals("Initialize")) {
        definingObject.setInstanceInitializeEventHandler(this);
        return;
      }
    }

    // Data member bound event handler

    Symbol symbol = definingObject.getScope().lookupShallow(eventTargetName);
    if (symbol == null) {
      compiler.error(getPosition(), Error.errUndefinedSymbol, eventTargetName);
      return;
    }

    if (!(symbol instanceof DataMemberSymbol)) {
      compiler.error(getPosition(), Error.errDataMemberExpected, eventTargetName);
      return;
    }

    DataMemberSymbol targetDataMember = (DataMemberSymbol) symbol;
    Type targetDataMemberType = targetDataMember.getType();
    if (!targetDataMemberType.isObjectType()) {
      compiler.error(getPosition(), Error.errObjectTypeNeeded, targetDataMemberType.toString());
      return;
    }

    targetDataMemberType.resolve(compiler);

    Scope scope = ((ObjectType) targetDataMemberType).getScope();
    if (scope instanceof ErrorScope) {
      // Error already reported
      return;
    }

    Symbol event = ((ObjectScope) scope).lookupInObject(eventName);
    if (event == null || !(event instanceof EventSymbol)) {
      compiler.error(getPosition(), Error.errUndefinedSymbol, eventName);
    }
  }
Beispiel #2
0
 public void emitSingleFunction(final FunctionSymbol sym) {
   System.out.println(sym);
   System.out.println(" -> " + sym.toString());
 }