def tokensToValue(self, tokens, scope): if not tokens or len(tokens) == 0: return None expression = SCSSExpression(tokens) expression.evaluate(scope) if not expression.tokens or len(expression.tokens) == 0: raise SCSSCompileError("Expression, expression, why did you eat my tokens?", tokens[0]) elif len(expression.tokens) == 1: return scssvariables.SCSSVariable.fromToken(expression.tokens[0]) else: return scssvariables.SCSSList.fromTokens(expression.tokens)
def evaluate(self, callerScope, arguments = None): try: scope = self.scope.clone() if arguments: self.mapArguments(arguments, callerScope, scope) for token in self.body: if token.isAssignment(): SCSSExpression.processAssignment(token, scope) elif token.isAtRule() and token.getKeyWord() == "return": expression = SCSSExpression(token.getSignature()) expression.evaluate(scope) if len(expression.tokens) == 0: raise SCSSRunTimeError("Could not evaluate return statement of function %s" % self.name) elif len(expression.tokens) == 1: return scssvariables.SCSSVariable.fromToken(expression.tokens[0]) else: return scssvariables.SCSSList.fromTokens(expression.tokens) else: raise SCSSRunTimeError("Unexpected token in function %s" % self.name, token) raise SCSSRunTimeError("Function %s does not return a value" % self.name) except Exception, exception: raise SCSSRunTimeError(str(exception) + "\n In call to function " + self.name)