tint: IntrinsicTable: Use [[display]] name for type matchers

TypeMatcher::String() was not respecting the [[display]] decoration of
the matcher's sub-types. By calling TypeMatcher::String() on the sub-types,
we can display the custom type names in diagnostics.

Bug: tint:1504
Change-Id: I0856fee31231f9c048d2e3028d25c4d261fbb008
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/90529
Reviewed-by: David Neto <dneto@google.com>
Commit-Queue: Ben Clayton <bclayton@chromium.org>
This commit is contained in:
Ben Clayton 2022-05-19 18:26:09 +00:00 committed by Dawn LUCI CQ
parent 0a63c6d2fb
commit b1fa457ab3
3 changed files with 229 additions and 194 deletions

View File

@ -231,7 +231,7 @@ class TypeMatcher {
/// @return a string representation of the matcher. Used for printing error /// @return a string representation of the matcher. Used for printing error
/// messages when no overload is found. /// messages when no overload is found.
virtual std::string String(MatchState& state) const = 0; virtual std::string String(MatchState* state) const = 0;
}; };
/// A NumberMatcher is the interface used to match a number or enumerator used /// A NumberMatcher is the interface used to match a number or enumerator used
@ -249,7 +249,7 @@ class NumberMatcher {
/// @return a string representation of the matcher. Used for printing error /// @return a string representation of the matcher. Used for printing error
/// messages when no overload is found. /// messages when no overload is found.
virtual std::string String(MatchState& state) const = 0; virtual std::string String(MatchState* state) const = 0;
}; };
/// TemplateTypeMatcher is a Matcher for a template type. /// TemplateTypeMatcher is a Matcher for a template type.
@ -270,7 +270,7 @@ class TemplateTypeMatcher : public TypeMatcher {
return nullptr; return nullptr;
} }
std::string String(MatchState& state) const override; std::string String(MatchState* state) const override;
private: private:
size_t index_; size_t index_;
@ -290,7 +290,7 @@ class TemplateNumberMatcher : public NumberMatcher {
return state.templates.Num(index_, number) ? number : Number::invalid; return state.templates.Num(index_, number) ? number : Number::invalid;
} }
std::string String(MatchState& state) const override; std::string String(MatchState* state) const override;
private: private:
size_t index_; size_t index_;
@ -1008,12 +1008,12 @@ std::string CallSignature(ProgramBuilder& builder,
return ss.str(); return ss.str();
} }
std::string TemplateTypeMatcher::String(MatchState& state) const { std::string TemplateTypeMatcher::String(MatchState* state) const {
return state.overload->template_types[index_].name; return state->overload->template_types[index_].name;
} }
std::string TemplateNumberMatcher::String(MatchState& state) const { std::string TemplateNumberMatcher::String(MatchState* state) const {
return state.overload->template_numbers[index_].name; return state->overload->template_numbers[index_].name;
} }
Impl::Impl(ProgramBuilder& b) : builder(b) {} Impl::Impl(ProgramBuilder& b) : builder(b) {}
@ -1477,13 +1477,13 @@ Number MatchState::Num(Number number) {
std::string MatchState::TypeName() { std::string MatchState::TypeName() {
MatcherIndex matcher_index = *matcher_indices_++; MatcherIndex matcher_index = *matcher_indices_++;
auto* matcher = matchers.type[matcher_index]; auto* matcher = matchers.type[matcher_index];
return matcher->String(*this); return matcher->String(this);
} }
std::string MatchState::NumName() { std::string MatchState::NumName() {
MatcherIndex matcher_index = *matcher_indices_++; MatcherIndex matcher_index = *matcher_indices_++;
auto* matcher = matchers.number[matcher_index]; auto* matcher = matchers.number[matcher_index];
return matcher->String(*this); return matcher->String(this);
} }
void Impl::ErrMultipleOverloadsMatched(size_t num_matched, void Impl::ErrMultipleOverloadsMatched(size_t num_matched,

File diff suppressed because it is too large Load Diff

View File

@ -188,7 +188,7 @@ class {{$class}} : public TypeMatcher {
const sem::Type* type) const override; const sem::Type* type) const override;
/// @param state the MatchState /// @param state the MatchState
/// @return a string representation of the matcher. /// @return a string representation of the matcher.
std::string String(MatchState& state) const override; std::string String(MatchState* state) const override;
}; };
const sem::Type* {{$class}}::Match(MatchState& state, const sem::Type* ty) const { const sem::Type* {{$class}}::Match(MatchState& state, const sem::Type* ty) const {
@ -207,7 +207,7 @@ const sem::Type* {{$class}}::Match(MatchState& state, const sem::Type* ty) const
return build_{{TrimLeft .Name "_"}}(state{{range .TemplateParams}}, {{.GetName}}{{end}}); return build_{{TrimLeft .Name "_"}}(state{{range .TemplateParams}}, {{.GetName}}{{end}});
} }
std::string {{$class}}::String(MatchState&{{if .TemplateParams}} state{{end}}) const { std::string {{$class}}::String(MatchState*{{if .TemplateParams}} state{{end}}) const {
{{- range .TemplateParams }} {{- range .TemplateParams }}
{{- template "DeclareLocalTemplateParamName" . }} {{- template "DeclareLocalTemplateParamName" . }}
{{- end }} {{- end }}
@ -244,7 +244,7 @@ class {{$class}} : public TypeMatcher {
const sem::Type* type) const override; const sem::Type* type) const override;
/// @param state the MatchState /// @param state the MatchState
/// @return a string representation of the matcher. /// @return a string representation of the matcher.
std::string String(MatchState& state) const override; std::string String(MatchState* state) const override;
}; };
const sem::Type* {{$class}}::Match(MatchState& state, const sem::Type* ty) const { const sem::Type* {{$class}}::Match(MatchState& state, const sem::Type* ty) const {
@ -256,15 +256,18 @@ const sem::Type* {{$class}}::Match(MatchState& state, const sem::Type* ty) const
return nullptr; return nullptr;
} }
std::string {{$class}}::String(MatchState&) const { std::string {{$class}}::String(MatchState*) const {
return " std::stringstream ss;
// Note: We pass nullptr to the TypeMatcher::String() functions, as 'matcher's do not support
// template arguments, nor can they match sub-types. As such, they have no use for the MatchState.
ss
{{- range .Types -}} {{- range .Types -}}
{{- if IsFirstIn . $.Types }}{{.Name}} {{- if IsFirstIn . $.Types }} << {{PascalCase .Name}}().String(nullptr)
{{- else if IsLastIn . $.Types }} or {{.Name}} {{- else if IsLastIn . $.Types }} << " or " << {{PascalCase .Name}}().String(nullptr)
{{- else }}, {{.Name}} {{- else }} << ", " << {{PascalCase .Name}}().String(nullptr)
{{- end -}} {{- end -}}
{{- end -}} {{- end -}};
"; return ss.str();
} }
{{ end -}} {{ end -}}
@ -287,7 +290,7 @@ class {{$class}} : public NumberMatcher {
Number Match(MatchState& state, Number number) const override; Number Match(MatchState& state, Number number) const override;
/// @param state the MatchState /// @param state the MatchState
/// @return a string representation of the matcher. /// @return a string representation of the matcher.
std::string String(MatchState& state) const override; std::string String(MatchState* state) const override;
}; };
{{ if eq 1 (len .Options) -}} {{ if eq 1 (len .Options) -}}
@ -312,7 +315,7 @@ Number {{$class}}::Match(MatchState&, Number number) const {
} }
{{- end }} {{- end }}
std::string {{$class}}::String(MatchState&) const { std::string {{$class}}::String(MatchState*) const {
return " return "
{{- range .Options -}} {{- range .Options -}}
{{- if IsFirstIn . $.Options }}{{.Name}} {{- if IsFirstIn . $.Options }}{{.Name}}
@ -405,11 +408,11 @@ Matchers::~Matchers() = default;
{{- define "DeclareLocalTemplateParamName" -}} {{- define "DeclareLocalTemplateParamName" -}}
{{- /* ------------------------------------------------------------------ */ -}} {{- /* ------------------------------------------------------------------ */ -}}
{{- if IsTemplateTypeParam . }} {{- if IsTemplateTypeParam . }}
const std::string {{.Name}} = state.TypeName(); const std::string {{.Name}} = state->TypeName();
{{- else if IsTemplateNumberParam . }} {{- else if IsTemplateNumberParam . }}
const std::string {{.Name}} = state.NumName(); const std::string {{.Name}} = state->NumName();
{{- else if IsTemplateEnumParam . }} {{- else if IsTemplateEnumParam . }}
const std::string {{.Name}} = state.NumName(); const std::string {{.Name}} = state->NumName();
{{- end -}} {{- end -}}
{{- end -}} {{- end -}}