-
Notifications
You must be signed in to change notification settings - Fork 37
Expand file tree
/
Copy pathCelType.java
More file actions
88 lines (77 loc) · 2.94 KB
/
CelType.java
File metadata and controls
88 lines (77 loc) · 2.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
// Copyright 2022 Google LLC
//
// 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
//
// https://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.
package dev.cel.common.types;
import static com.google.common.collect.ImmutableList.toImmutableList;
import com.google.common.collect.ImmutableList;
import com.google.errorprone.annotations.CanIgnoreReturnValue;
import com.google.errorprone.annotations.CheckReturnValue;
import com.google.errorprone.annotations.Immutable;
import java.util.function.Function;
/**
* Abstract representation of a CEL type which indicates its {@code CelKind}, {@code name}, and
* {@code parameters}.
*
* <p>Each type also exposes functions to generate a copy of the type containing fresh type
* variables, and a function for generating a new instance of the type with a different set of type
* parameters. These functions are critical for making type inferences.
*/
@Immutable
@CheckReturnValue
public abstract class CelType {
protected CelType() {}
/** Return the type {@code CelKind}. */
public abstract CelKind kind();
/**
* Return the type name.
*
* <p>For struct types this should be the fully qualified name. Be wary of introducing unqualified
* type names as they may collide with future CEL type.
*/
public abstract String name();
/** Return the type parameters. e.g. a map's key and value {@code CelType}. */
public ImmutableList<CelType> parameters() {
return ImmutableList.of();
}
/**
* Determine whether {@code this} type is assignable from the {@code other} type value.
*
* <p>Defaults to an equality test.
*/
public boolean isAssignableFrom(CelType other) {
return this.equals(other);
}
/**
* Instantiate a new copy of this type with alternative {@code parameters}.
*
* <p>If the {@code CelType} does not have any {@code parameters}, then the return value defaults
* to the original type instance.
*/
@CanIgnoreReturnValue
public CelType withParameters(ImmutableList<CelType> parameters) {
return this;
}
/**
* Instantiate a new copy of this type with alternative {@code parameters}.
*
* <p>If the {@code CelType} does not have any {@code parameters}, then the return value defaults
* to the original type instance.
*/
@CanIgnoreReturnValue
public CelType withFreshTypeParamVariables(Function<String, String> varNameGenerator) {
return withParameters(
parameters().stream()
.map(p -> p.withFreshTypeParamVariables(varNameGenerator))
.collect(toImmutableList()));
}
}