示例#1
0
  public void getAdoptedByLexicalParent(
      DynamicObject lexicalParent, String name, Node currentNode) {
    assert RubyGuards.isRubyModule(lexicalParent);

    Layouts.MODULE
        .getFields(lexicalParent)
        .setConstantInternal(currentNode, name, rubyModuleObject, false);
    Layouts.MODULE.getFields(lexicalParent).addLexicalDependent(rubyModuleObject);

    if (this.name == null) {
      // Tricky, we need to compare with the Object class, but we only have a Class at hand.
      final DynamicObject classClass = Layouts.BASIC_OBJECT.getLogicalClass(getLogicalClass());
      final DynamicObject objectClass =
          ClassNodes.getSuperClass(ClassNodes.getSuperClass(classClass));

      if (lexicalParent == objectClass) {
        this.name = name;
        updateAnonymousChildrenModules();
      } else if (Layouts.MODULE.getFields(lexicalParent).hasName()) {
        this.name = Layouts.MODULE.getFields(lexicalParent).getName() + "::" + name;
        updateAnonymousChildrenModules();
      }
      // else: Our lexicalParent is also an anonymous module
      // and will name us when it gets named via updateAnonymousChildrenModules()
    }
  }