/**
 * Copyright (c) 2020-present, Goldman Sachs
 *
 * 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.
 */
import { LambdaFunction } from '../../../../../../../../graph/metamodel/pure/valueSpecification/LambdaFunction.js';
import { Class } from '../../../../../../../../graph/metamodel/pure/packageableElements/domain/Class.js';
import { type GraphFetchTree, PropertyGraphFetchTree, RootGraphFetchTree } from '../../../../../../../../graph/metamodel/pure/valueSpecification/GraphFetchTree.js';
import { ValueSpecification } from '../../../../../../../../graph/metamodel/pure/valueSpecification/ValueSpecification.js';
import { SimpleFunctionExpression } from '../../../../../../../../graph/metamodel/pure/valueSpecification/Expression.js';
import type { Type } from '../../../../../../../../graph/metamodel/pure/packageableElements/domain/Type.js';
import type { V1_ValueSpecificationVisitor, V1_ValueSpecification } from '../../../../model/valueSpecification/V1_ValueSpecification.js';
import type { V1_GraphBuilderContext } from '../../../../transformation/pureGraph/to/V1_GraphBuilderContext.js';
import type { V1_Lambda } from '../../../../model/valueSpecification/raw/V1_Lambda.js';
import { V1_Variable } from '../../../../model/valueSpecification/V1_Variable.js';
import { V1_ProcessingContext } from './V1_ProcessingContext.js';
import { V1_PropertyGraphFetchTree } from '../../../../model/valueSpecification/raw/classInstance/graph/V1_PropertyGraphFetchTree.js';
import { V1_RootGraphFetchTree } from '../../../../model/valueSpecification/raw/classInstance/graph/V1_RootGraphFetchTree.js';
import type { V1_GraphFetchTree } from '../../../../model/valueSpecification/raw/classInstance/graph/V1_GraphFetchTree.js';
import type { V1_AppliedFunction } from '../../../../model/valueSpecification/application/V1_AppliedFunction.js';
import type { V1_AppliedProperty } from '../../../../model/valueSpecification/application/V1_AppliedProperty.js';
import type { V1_CBoolean } from '../../../../model/valueSpecification/raw/V1_CBoolean.js';
import type { V1_CByteArray } from '../../../../model/valueSpecification/raw/V1_CByteArray.js';
import type { V1_CDateTime } from '../../../../model/valueSpecification/raw/V1_CDateTime.js';
import type { V1_CStrictTime } from '../../../../model/valueSpecification/raw/V1_CStrictTime.js';
import type { V1_CDecimal } from '../../../../model/valueSpecification/raw/V1_CDecimal.js';
import type { V1_CFloat } from '../../../../model/valueSpecification/raw/V1_CFloat.js';
import type { V1_CInteger } from '../../../../model/valueSpecification/raw/V1_CInteger.js';
import type { V1_CLatestDate } from '../../../../model/valueSpecification/raw/V1_CLatestDate.js';
import type { V1_Collection } from '../../../../model/valueSpecification/raw/V1_Collection.js';
import type { V1_CStrictDate } from '../../../../model/valueSpecification/raw/V1_CStrictDate.js';
import { V1_CString } from '../../../../model/valueSpecification/raw/V1_CString.js';
import type { V1_EnumValue } from '../../../../model/valueSpecification/raw/V1_EnumValue.js';
import type { V1_KeyExpression } from '../../../../model/valueSpecification/raw/V1_KeyExpression.js';
import type { V1_PackageableElementPtr } from '../../../../model/valueSpecification/raw/V1_PackageableElementPtr.js';
import type { V1_INTERNAL__UnknownValueSpecification } from '../../../../model/valueSpecification/V1_INTERNAL__UnknownValueSpecfication.js';
import type { V1_ClassInstance } from '../../../../model/valueSpecification/raw/V1_ClassInstance.js';
import type { V1_GenericTypeInstance } from '../../../../model/valueSpecification/raw/V1_GenericTypeInstance.js';
export declare class V1_ValueSpecificationBuilder implements V1_ValueSpecificationVisitor<ValueSpecification> {
    context: V1_GraphBuilderContext;
    processingContext: V1_ProcessingContext;
    openVariables: string[];
    checkFunctionName?: boolean | undefined;
    constructor(context: V1_GraphBuilderContext, processingContext: V1_ProcessingContext, openVariables: string[], checkFunctionName?: boolean | undefined);
    visit_INTERNAL__UnknownValueSpecfication(valueSpecification: V1_INTERNAL__UnknownValueSpecification): ValueSpecification;
    visit_Variable(variable: V1_Variable): ValueSpecification;
    visit_Lambda(valueSpecification: V1_Lambda): ValueSpecification;
    visit_KeyExpression(valueSpecification: V1_KeyExpression): ValueSpecification;
    visit_AppliedFunction(appliedFunction: V1_AppliedFunction): ValueSpecification;
    visit_AppliedProperty(valueSpecification: V1_AppliedProperty): ValueSpecification;
    visit_PackageableElementPtr(valueSpecification: V1_PackageableElementPtr): ValueSpecification;
    visit_GenericTypeInstance(valueSpecification: V1_GenericTypeInstance): ValueSpecification;
    visit_Collection(valueSpecification: V1_Collection): ValueSpecification;
    visit_EnumValue(valueSpecification: V1_EnumValue): ValueSpecification;
    visit_CInteger(valueSpecification: V1_CInteger): ValueSpecification;
    visit_CDecimal(valueSpecification: V1_CDecimal): ValueSpecification;
    visit_CString(valueSpecification: V1_CString): ValueSpecification;
    visit_CBoolean(valueSpecification: V1_CBoolean): ValueSpecification;
    visit_CByteArray(valueSpecification: V1_CByteArray): ValueSpecification;
    visit_CFloat(valueSpecification: V1_CFloat): ValueSpecification;
    visit_CDateTime(valueSpecification: V1_CDateTime): ValueSpecification;
    visit_CStrictDate(valueSpecification: V1_CStrictDate): ValueSpecification;
    visit_CStrictTime(valueSpecification: V1_CStrictTime): ValueSpecification;
    visit_CLatestDate(valueSpecification: V1_CLatestDate): ValueSpecification;
    visit_ClassInstance(valueSpecification: V1_ClassInstance): ValueSpecification;
}
export declare function V1_buildLambdaBody(expressions: V1_ValueSpecification[], parameters: V1_Variable[], context: V1_GraphBuilderContext, processingContext: V1_ProcessingContext): LambdaFunction;
export declare function V1_buildValueSpecification(valueSpecification: V1_ValueSpecification, context: V1_GraphBuilderContext): ValueSpecification;
export declare function V1_processProperty(context: V1_GraphBuilderContext, openVariables: string[], processingContext: V1_ProcessingContext, parameters: V1_ValueSpecification[], property: string): ValueSpecification;
export declare const V1_buildBaseSimpleFunctionExpression: (processedParameters: ValueSpecification[], functionName: string, compileContext: V1_GraphBuilderContext) => SimpleFunctionExpression;
/**
 * NOTE: this is a catch-all builder for all functions we support
 * This is extremely basic and will fail for any functions that needs proper
 * type-inferencing of the return and the parameters.
 */
export declare const V1_buildGenericFunctionExpression: (functionName: string, parameters: V1_ValueSpecification[], openVariables: string[], compileContext: V1_GraphBuilderContext, processingContext: V1_ProcessingContext) => SimpleFunctionExpression;
export declare const V1_buildGenericLetFunctionExpression: (functionName: string, parameters: V1_ValueSpecification[], openVariables: string[], compileContext: V1_GraphBuilderContext, processingContext: V1_ProcessingContext) => SimpleFunctionExpression;
/**
 * This is fairly similar to how engine does function matching in a way.
 * Notice that Studio core should not attempt to do any function inferencing/matching
 * at all as the job is meant for engine.
 *
 * On the other hand, the function handling/matching plugin mechanism is meant
 * for extensions which should try to understand/match functions such as query builder.
 */
export declare function V1_buildFunctionExpression(functionName: string, parameters: V1_ValueSpecification[], openVariables: string[], compileContext: V1_GraphBuilderContext, processingContext: V1_ProcessingContext, checkFunctionName?: boolean | undefined): SimpleFunctionExpression;
export declare function V1_resolvePropertyExpressionTypeInference(inferredVariable: ValueSpecification | undefined, compileContext: V1_GraphBuilderContext): Type | undefined;
export declare function V1_buildGraphFetchTree(graphFetchTree: V1_GraphFetchTree, context: V1_GraphBuilderContext, parentClass: Class | undefined, openVariables: string[], processingContext: V1_ProcessingContext, canResolveLocalProperty?: boolean | undefined): GraphFetchTree;
export declare function V1_buildPropertyGraphFetchTree(propertyGraphFetchTree: V1_PropertyGraphFetchTree, context: V1_GraphBuilderContext, parentClass: Class, openVariables: string[], processingContext: V1_ProcessingContext, canResolveLocalProperty?: boolean | undefined): PropertyGraphFetchTree;
export declare function V1_buildRootGraphFetchTree(rootGraphFetchTree: V1_RootGraphFetchTree, context: V1_GraphBuilderContext, openVariables: string[], processingContext: V1_ProcessingContext, canResolveLocalProperty?: boolean | undefined): RootGraphFetchTree;
//# sourceMappingURL=V1_ValueSpecificationBuilderHelper.d.ts.map