ifndef SASS_EXTENSION_H define SASS_EXTENSION_H

// sass.hpp must go before all system headers to get the // __EXTENSIONS__ fix on Solaris. include “sass.hpp”

include <unordered_map> include <unordered_set> include “ast_fwd_decl.hpp” include “backtrace.hpp”

namespace Sass {

class Extension {

public:

  // The selector in which the `@extend` appeared.
  ComplexSelectorObj extender;

  // The selector that's being extended.
  // `null` for one-off extensions.
  SimpleSelectorObj target;

  // The minimum specificity required for any
  // selector generated from this extender.
  size_t specificity;

  // Whether this extension is optional.
  bool isOptional;

  // Whether this is a one-off extender representing a selector that was
  // originally in the document, rather than one defined with `@extend`.
  bool isOriginal;

  bool isSatisfied;

  // The media query context to which this extend is restricted,
  // or `null` if it can apply within any context.
  CssMediaRuleObj mediaContext;

  // Creates a one-off extension that's not intended to be modified over time.
  // If [specificity] isn't passed, it defaults to `extender.maxSpecificity`.
  Extension(ComplexSelectorObj extender) :
    extender(extender),
    target({}),
    specificity(0),
    isOptional(true),
    isOriginal(false),
    isSatisfied(false),
    mediaContext({}) {

  }

  // Copy constructor
  Extension(const Extension& extension) :
    extender(extension.extender),
    target(extension.target),
    specificity(extension.specificity),
    isOptional(extension.isOptional),
    isOriginal(extension.isOriginal),
    isSatisfied(extension.isSatisfied),
    mediaContext(extension.mediaContext) {

  }

  // Default constructor
  Extension() :
    extender({}),
    target({}),
    specificity(0),
    isOptional(false),
    isOriginal(false),
    isSatisfied(false),
    mediaContext({}) {
  }

  // Asserts that the [mediaContext] for a selector is 
  // compatible with the query context for this extender.
  void assertCompatibleMediaContext(CssMediaRuleObj mediaContext, Backtraces& traces) const;

  Extension withExtender(const ComplexSelectorObj& newExtender) const;

};

}

endif