// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

package com.google.dart.compiler.resolver;

import com.google.dart.compiler.type.InterfaceType;
import com.google.dart.compiler.type.Type;

import java.util.List;

public interface ClassElement extends EnclosingElement {
  void setType(InterfaceType type);

  @Override
  InterfaceType getType();

  List<Type> getTypeParameters();

  InterfaceType getSupertype();

  InterfaceType getDefaultClass();

  void setSupertype(InterfaceType element);

  List<? extends ConstructorElement> getConstructors();

  LibraryElement getLibrary();

  List<InterfaceType> getInterfaces();
  
  List<InterfaceType> getMixins();

  List<InterfaceType> getAllSupertypes() throws CyclicDeclarationException;

  String getNativeName();

  /**
   * FIXME(scheglov) We use this in {@link Resolver} to check that "factory" clause is exactly
   * same as declaration of factory class.
   */
  String getDeclarationNameWithTypeParameters();

  boolean isObject();

  boolean isObjectChild();

  ConstructorElement lookupConstructor(String name);

  /**
   * @return the {@link Element}s which are declared in superclass or interfaces, but not
   *         implemented in this class. May be <code>null</code> if this {@link ClassElement} is
   *         {@link ClassNodeElement} and was not analyzed yet.
   */
  List<Element> getUnimplementedMembers();
  
  int getOpenBraceOffset();
  
  int getCloseBraceOffset();
  
  boolean hasSuperInvocation();
}
