// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef _PARSER_HELPER_INCLUDED_
#define _PARSER_HELPER_INCLUDED_

#include "Diagnostics.h"
#include "DirectiveHandler.h"
#include "localintermediate.h"
#include "preprocessor/Preprocessor.h"
#include "Compiler.h"
#include "SymbolTable.h"

struct TMatrixFields {
	bool wholeRow;
	bool wholeCol;
	int row;
	int col;
};

//
// The following are extra variables needed during parsing, grouped together so
// they can be passed to the parser without needing a global.
//
class TParseContext {
public:
	TParseContext(TSymbolTable& symt, TExtensionBehavior& ext, TIntermediate& interm, GLenum type, int options, bool checksPrecErrors, const char* sourcePath, TInfoSink& is) :
			intermediate(interm),
			symbolTable(symt),
			compileOptions(options),
			sourcePath(sourcePath),
			lexAfterType(false),
			inTypeParen(false),
			AfterEOF(false),
			mDeferredSingleDeclarationErrorCheck(false),
			mShaderType(type),
			mShaderVersion(100),
			mTreeRoot(0),
			mLoopNestingLevel(0),
			mSwitchNestingLevel(0),
			mStructNestingLevel(0),
			mCurrentFunctionType(nullptr),
			mFunctionReturnsValue(false),
			mChecksPrecisionErrors(checksPrecErrors),
			mDefaultMatrixPacking(EmpColumnMajor),
			mDefaultBlockStorage(EbsShared),
			mDiagnostics(is),
			mDirectiveHandler(ext, mDiagnostics, mShaderVersion),
			mPreprocessor(&mDiagnostics, &mDirectiveHandler, pp::PreprocessorSettings()),
			mScanner(nullptr),
			mUsesFragData(false),
			mUsesFragColor(false) {  }
	TIntermediate& intermediate; // to hold and build a parse tree
	TSymbolTable& symbolTable;   // symbol table that goes with the language currently being parsed
	int compileOptions;
	const char* sourcePath;      // Path of source file or null.
	bool lexAfterType;           // true if we've recognized a type, so can only be looking for an identifier
	bool inTypeParen;            // true if in parentheses, looking only for an identifier
	bool AfterEOF;

	const pp::Preprocessor &getPreprocessor() const { return mPreprocessor; }
	pp::Preprocessor &getPreprocessor() { return mPreprocessor; }
	void *getScanner() const { return mScanner; }
	void setScanner(void *scanner) { mScanner = scanner; }
	int getShaderVersion() const { return mShaderVersion; }
	GLenum getShaderType() const { return mShaderType; }
	int numErrors() const { return mDiagnostics.numErrors(); }
	TInfoSink &infoSink() { return mDiagnostics.infoSink(); }
	void error(const TSourceLoc &loc, const char *reason, const char* token,
	           const char* extraInfo="");
	void warning(const TSourceLoc &loc, const char* reason, const char* token,
	             const char* extraInfo="");
	void info(const TSourceLoc &loc, const char* reason, const char* token,
	          const char* extraInfo="");
	void trace(const char* str);
	void recover();
	TIntermNode *getTreeRoot() const { return mTreeRoot; }
	void setTreeRoot(TIntermNode *treeRoot) { mTreeRoot = treeRoot; }

	bool getFunctionReturnsValue() const { return mFunctionReturnsValue; }
	void setFunctionReturnsValue(bool functionReturnsValue)
	{
		mFunctionReturnsValue = functionReturnsValue;
	}

	void setLoopNestingLevel(int loopNestintLevel)
	{
		mLoopNestingLevel = loopNestintLevel;
	}

	const TType *getCurrentFunctionType() const { return mCurrentFunctionType; }
	void setCurrentFunctionType(const TType *currentFunctionType)
	{
		mCurrentFunctionType = currentFunctionType;
	}

	void incrLoopNestingLevel() { ++mLoopNestingLevel; }
	void decrLoopNestingLevel() { --mLoopNestingLevel; }

	void incrSwitchNestingLevel() { ++mSwitchNestingLevel; }
	void decrSwitchNestingLevel() { --mSwitchNestingLevel; }

	// This method is guaranteed to succeed, even if no variable with 'name' exists.
	const TVariable *getNamedVariable(const TSourceLoc &location, const TString *name, const TSymbol *symbol);

	bool parseVectorFields(const TString&, int vecSize, TVectorFields&, const TSourceLoc &line);

	bool reservedErrorCheck(const TSourceLoc &line, const TString& identifier);
	void assignError(const TSourceLoc &line, const char* op, TString left, TString right);
	void unaryOpError(const TSourceLoc &line, const char* op, TString operand);
	void binaryOpError(const TSourceLoc &line, const char* op, TString left, TString right);
	bool precisionErrorCheck(const TSourceLoc &line, TPrecision precision, TBasicType type);
	bool lValueErrorCheck(const TSourceLoc &line, const char* op, TIntermTyped*);
	bool constErrorCheck(TIntermTyped* node);
	bool integerErrorCheck(TIntermTyped* node, const char* token);
	bool globalErrorCheck(const TSourceLoc &line, bool global, const char* token);
	bool constructorErrorCheck(const TSourceLoc &line, TIntermNode*, TFunction&, TOperator, TType*);
	bool arraySizeErrorCheck(const TSourceLoc &line, TIntermTyped* expr, int& size);
	bool arrayQualifierErrorCheck(const TSourceLoc &line, TPublicType type);
	bool arrayTypeErrorCheck(const TSourceLoc &line, TPublicType type);
	bool voidErrorCheck(const TSourceLoc&, const TString&, const TBasicType&);
	bool boolErrorCheck(const TSourceLoc&, const TIntermTyped*);
	bool boolErrorCheck(const TSourceLoc&, const TPublicType&);
	bool samplerErrorCheck(const TSourceLoc &line, const TPublicType& pType, const char* reason);
	bool locationDeclaratorListCheck(const TSourceLoc &line, const TPublicType &pType);
	bool structQualifierErrorCheck(const TSourceLoc &line, const TPublicType& pType);
	bool parameterSamplerErrorCheck(const TSourceLoc &line, TQualifier qualifier, const TType& type);
	bool nonInitConstErrorCheck(const TSourceLoc &line, TString& identifier, TPublicType& type, bool array);
	bool nonInitErrorCheck(const TSourceLoc &line, const TString& identifier, TPublicType& type);
	bool paramErrorCheck(const TSourceLoc &line, TQualifier qualifier, TQualifier paramQualifier, TType* type);
	bool extensionErrorCheck(const TSourceLoc &line, const TString&);
	bool singleDeclarationErrorCheck(const TPublicType &publicType, const TSourceLoc &identifierLocation);
	bool layoutLocationErrorCheck(const TSourceLoc& location, const TLayoutQualifier &layoutQualifier);
	bool functionCallLValueErrorCheck(const TFunction *fnCandidate, TIntermAggregate *);
	void es3InvariantErrorCheck(const TQualifier qualifier, const TSourceLoc &invariantLocation);
	void checkInputOutputTypeIsValidES3(const TQualifier qualifier, const TPublicType &type, const TSourceLoc &qualifierLocation);

	const TExtensionBehavior& extensionBehavior() const { return mDirectiveHandler.extensionBehavior(); }
	bool supportsExtension(const char* extension);
	void handleExtensionDirective(const TSourceLoc &line, const char* extName, const char* behavior);

	const TPragma& pragma() const { return mDirectiveHandler.pragma(); }
	void handlePragmaDirective(const TSourceLoc &line, const char* name, const char* value, bool stdgl);

	bool containsSampler(TType& type);
	const TFunction* findFunction(const TSourceLoc &line, TFunction* pfnCall, bool *builtIn = 0);
	bool executeInitializer(const TSourceLoc &line, const TString &identifier, const TPublicType &pType,
	                        TIntermTyped *initializer, TIntermNode **intermNode);

	TPublicType addFullySpecifiedType(TQualifier qualifier, bool invariant, TLayoutQualifier layoutQualifier, const TPublicType &typeSpecifier);
	bool arraySetMaxSize(TIntermSymbol*, TType*, int, bool, const TSourceLoc&);

	TIntermAggregate *parseSingleDeclaration(TPublicType &publicType, const TSourceLoc &identifierOrTypeLocation, const TString &identifier);
	TIntermAggregate *parseSingleArrayDeclaration(TPublicType &publicType, const TSourceLoc &identifierLocation, const TString &identifier,
	                                              const TSourceLoc &indexLocation, TIntermTyped *indexExpression);
	TIntermAggregate *parseSingleInitDeclaration(const TPublicType &publicType, const TSourceLoc &identifierLocation, const TString &identifier,
	                                             const TSourceLoc &initLocation, TIntermTyped *initializer);

	// Parse a declaration like "type a[n] = initializer"
	// Note that this does not apply to declarations like "type[n] a = initializer"
	TIntermAggregate *parseSingleArrayInitDeclaration(TPublicType &publicType, const TSourceLoc &identifierLocation, const TString &identifier,
	                                                  const TSourceLoc &indexLocation, TIntermTyped *indexExpression,
	                                                  const TSourceLoc &initLocation, TIntermTyped *initializer);

	TIntermAggregate *parseInvariantDeclaration(const TSourceLoc &invariantLoc, const TSourceLoc &identifierLoc, const TString *identifier,
	                                            const TSymbol *symbol);

	TIntermAggregate *parseDeclarator(TPublicType &publicType, TIntermAggregate *aggregateDeclaration, const TSourceLoc &identifierLocation,
	                                  const TString &identifier);
	TIntermAggregate *parseArrayDeclarator(TPublicType &publicType, TIntermAggregate *aggregateDeclaration, const TSourceLoc &identifierLocation,
	                                       const TString &identifier, const TSourceLoc &arrayLocation, TIntermTyped *indexExpression);
	TIntermAggregate *parseInitDeclarator(const TPublicType &publicType, TIntermAggregate *aggregateDeclaration, const TSourceLoc &identifierLocation,
	                                      const TString &identifier, const TSourceLoc &initLocation, TIntermTyped *initializer);

	// Parse a declarator like "a[n] = initializer"
	TIntermAggregate *parseArrayInitDeclarator(const TPublicType &publicType, TIntermAggregate *aggregateDeclaration, const TSourceLoc &identifierLocation,
	                                           const TString &identifier, const TSourceLoc &indexLocation, TIntermTyped *indexExpression,
                                               const TSourceLoc &initLocation, TIntermTyped *initializer);

	void parseGlobalLayoutQualifier(const TPublicType &typeQualifier);
	TIntermAggregate *addFunctionPrototypeDeclaration(const TFunction &function, const TSourceLoc &location);
	TIntermAggregate *addFunctionDefinition(const TFunction &function, TIntermAggregate *functionPrototype, TIntermAggregate *functionBody, const TSourceLoc &location);
	void parseFunctionPrototype(const TSourceLoc &location, TFunction *function, TIntermAggregate **aggregateOut);
	TFunction *parseFunctionDeclarator(const TSourceLoc &location, TFunction *function);
	TFunction *addConstructorFunc(const TPublicType &publicType);
	TIntermTyped* addConstructor(TIntermNode*, const TType*, TOperator, TFunction*, const TSourceLoc&);
	TIntermTyped* foldConstConstructor(TIntermAggregate* aggrNode, const TType& type);
	TIntermTyped* addConstVectorNode(TVectorFields&, TIntermTyped*, const TSourceLoc&);
	TIntermTyped* addConstMatrixNode(int, TIntermTyped*, const TSourceLoc&);
	TIntermTyped* addConstArrayNode(int index, TIntermTyped* node, const TSourceLoc &line);
	TIntermTyped* addConstStruct(const TString&, TIntermTyped*, const TSourceLoc&);
	TIntermTyped *addIndexExpression(TIntermTyped *baseExpression, const TSourceLoc& location, TIntermTyped *indexExpression);
	TIntermTyped* addFieldSelectionExpression(TIntermTyped *baseExpression, const TSourceLoc &dotLocation, const TString &fieldString, const TSourceLoc &fieldLocation);

	TFieldList *addStructDeclaratorList(const TPublicType &typeSpecifier, TFieldList *fieldList);
	TPublicType addStructure(const TSourceLoc &structLine, const TSourceLoc &nameLine, const TString *structName, TFieldList *fieldList);

	TIntermAggregate* addInterfaceBlock(const TPublicType& typeQualifier, const TSourceLoc& nameLine, const TString& blockName, TFieldList* fieldList,
	                                    const TString* instanceName, const TSourceLoc& instanceLine, TIntermTyped* arrayIndex, const TSourceLoc& arrayIndexLine);

	TLayoutQualifier parseLayoutQualifier(const TString &qualifierType, const TSourceLoc& qualifierTypeLine);
	TLayoutQualifier parseLayoutQualifier(const TString &qualifierType, const TSourceLoc& qualifierTypeLine, const TString &intValueString, int intValue, const TSourceLoc& intValueLine);
	TLayoutQualifier joinLayoutQualifiers(TLayoutQualifier leftQualifier, TLayoutQualifier rightQualifier);
	TPublicType joinInterpolationQualifiers(const TSourceLoc &interpolationLoc, TQualifier interpolationQualifier, const TSourceLoc &storageLoc, TQualifier storageQualifier);

	// Performs an error check for embedded struct declarations.
	// Returns true if an error was raised due to the declaration of
	// this struct.
	bool enterStructDeclaration(const TSourceLoc &line, const TString& identifier);
	void exitStructDeclaration();

	bool structNestingErrorCheck(const TSourceLoc &line, const TField &field);

	TIntermSwitch *addSwitch(TIntermTyped *init, TIntermAggregate *statementList, const TSourceLoc &loc);
	TIntermCase *addCase(TIntermTyped *condition, const TSourceLoc &loc);
	TIntermCase *addDefault(const TSourceLoc &loc);

	TIntermTyped *addUnaryMath(TOperator op, TIntermTyped *child, const TSourceLoc &loc);
	TIntermTyped *addUnaryMathLValue(TOperator op, TIntermTyped *child, const TSourceLoc &loc);
	TIntermTyped *addBinaryMath(TOperator op, TIntermTyped *left, TIntermTyped *right, const TSourceLoc &loc);
	TIntermTyped *addBinaryMathBooleanResult(TOperator op, TIntermTyped *left, TIntermTyped *right, const TSourceLoc &loc);

	TIntermTyped *addAssign(TOperator op, TIntermTyped *left, TIntermTyped *right, const TSourceLoc &loc);

	TIntermBranch *addBranch(TOperator op, const TSourceLoc &loc);
	TIntermBranch *addBranch(TOperator op, TIntermTyped *returnValue, const TSourceLoc &loc);

	TIntermTyped *addFunctionCallOrMethod(TFunction *fnCall, TIntermNode *paramNode, TIntermNode *thisNode, const TSourceLoc &loc, bool *fatalError);

	TIntermTyped *addTernarySelection(TIntermTyped *cond, TIntermTyped *trueBlock, TIntermTyped *falseBlock, const TSourceLoc &line);

private:
	bool declareVariable(const TSourceLoc &line, const TString &identifier, const TType &type, TVariable **variable);

	TIntermTyped *addBinaryMathInternal(TOperator op, TIntermTyped *left, TIntermTyped *right, const TSourceLoc &loc);
	TIntermTyped *createAssign(TOperator op, TIntermTyped *left, TIntermTyped *right, const TSourceLoc &loc);

	// The funcReturnType parameter is expected to be non-null when the operation is a built-in function.
	// It is expected to be null for other unary operators.
	TIntermTyped *createUnaryMath(TOperator op, TIntermTyped *child, const TSourceLoc &loc, const TType *funcReturnType);

	// Return true if the checks pass
	bool binaryOpCommonCheck(TOperator op, TIntermTyped *left, TIntermTyped *right, const TSourceLoc &loc);

	// Set to true when the last/current declarator list was started with an empty declaration.
	bool mDeferredSingleDeclarationErrorCheck;

	GLenum mShaderType;              // vertex or fragment language (future: pack or unpack)
	int mShaderVersion;
	TIntermNode *mTreeRoot;       // root of parse tree being created
	int mLoopNestingLevel;       // 0 if outside all loops
	int mSwitchNestingLevel;     // 0 if outside all switch statements
	int mStructNestingLevel;      // incremented while parsing a struct declaration
	const TType *mCurrentFunctionType;  // the return type of the function that's currently being parsed
	bool mFunctionReturnsValue;  // true if a non-void function has a return
	bool mChecksPrecisionErrors;  // true if an error will be generated when a variable is declared without precision, explicit or implicit.

	TLayoutMatrixPacking mDefaultMatrixPacking;
	TLayoutBlockStorage mDefaultBlockStorage;
	TDiagnostics mDiagnostics;
	TDirectiveHandler mDirectiveHandler;
	pp::Preprocessor mPreprocessor;
	void *mScanner;
	bool mUsesFragData; // track if we are using both gl_FragData and gl_FragColor
	bool mUsesFragColor;
};

int PaParseStrings(int count, const char* const string[], const int length[],
                   TParseContext* context);

#endif // _PARSER_HELPER_INCLUDED_
