Skip to content

Add scalar equality tags for complex64 and complex128 - #113

Merged
leocavalcante merged 3 commits into
mainfrom
feat/complex-types
Sep 29, 2026
Merged

leocavalcante merged 3 commits into
mainfrom
feat/complex-types

Conversation

@leocavalcante

Copy link
Copy Markdown
Member

Fixes #80

Summary

  • Accept eq, neq, in, nin, and required on scalar complex64 and complex128. Equality uses Go == / !=. required uses != 0, the complex zero value 0+0i.
  • Reject gt, gte, lt, and lte on complex types. Go has no <, >, <=, or >= for complex values, so those tags are analyzer errors and are not generated. Field ordering tags stay rejected from Add complex64 and complex128 field equality tags #108.
  • Slice, array, and map complex values stay unsupported. Pointer forms are not generated (skipPointer).

Test plan

  • go test ./internal/analyzer/... ./internal/codegenerator/ ./testgen/
  • make unittests
  • make endtoendtests for both widths, including zero and nonzero required (0, 0+1i, 1+0i)

Go can compare complex values with == and !=, and the zero value is 0+0i. Ordering tags stay rejected because complex numbers have no < or >.
@leocavalcante leocavalcante added enhancement New feature or request go Pull requests that update go code labels Sep 29, 2026
@leocavalcante leocavalcante self-assigned this Sep 29, 2026
@leocavalcante
leocavalcante requested a balanced review from Copilot September 29, 2026 21:21

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

Complex pointers pass analyzer validation but fail later because matching generator conditions are intentionally absent.

Review effort: Balanced
Findings: 1 High severity

Open (1)
What changed in this PR

Adds scalar complex-number validation support while rejecting unsupported ordering and composed forms.

Changes:

  • Enables eq, neq, in, nin, and required for complex64/complex128.
  • Adds generator, analyzer, unit, and end-to-end coverage.
  • Updates validation documentation and support matrices.
File Description
README.md Documents complex validation support.
docs/​internals.md Explains complex generation behavior.
internal/​analyzer/​analyzer_test.go Tests accepted and rejected complex operations.
internal/​analyzer/​operations/​operations_list.go Allows scalar complex operations.
internal/​analyzer/​operations/​operations_test.go Tests operation/type compatibility.
internal/​codegenerator/​condition_table.go Adds complex equality and required conditions.
internal/​codegenerator/​generated_function_code_no_pointer_test.go Adds generated-function expectations.
internal/​codegenerator/​generated_validation_code_no_pointer_test.go Adds generated-validation expectations.
internal/​codegenerator/​get_test_elements_all_types_test.go Tests complex condition elements.
internal/​codegenerator/​get_test_elements_errors_test.go Tests unsupported complex forms.
testgen/​README.md Updates generator coverage documentation.
testgen/​coverage_test.go Skips unsupported complex pointer cases.
testgen/​generate_cmp_perf_tests.go Applies pointer exclusions to benchmarks.
testgen/​generate_function_code_tests.go Applies pointer exclusions to function tests.
testgen/​generate_validation_code_tests.go Applies pointer exclusions to validation tests.
testgen/​generate_validation_types_tests.go Applies pointer exclusions to end-to-end generation.
testgen/​validations.go Defines scalar complex test cases.
tests/​endtoend/​complex.go Adds complex end-to-end scenarios.
tests/​endtoend/​generated_endtoend_no_pointer_tests.go Adds generated scalar complex cases.
tests/​endtoend/​main.go Runs the complex test suite.
tests/​endtoend/​validator__.go Adds generated complex validators.
Files not reviewed (4)
  • internal/codegenerator/generated_function_code_no_pointer_test.go: Generated file
  • internal/codegenerator/generated_validation_code_no_pointer_test.go: Generated file
  • tests/endtoend/generated_endtoend_no_pointer_tests.go: Generated file
  • tests/endtoend/validator__.go: Generated file

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread internal/analyzer/operations/operations_list.go
IsValidByType was treating a leading * as ignorable, so *complex64 passed the catalog and then failed in the generator. Those tags now fail analysis because there is no complex-pointer condition.
# Conflicts:
#	tests/endtoend/validator__.go
@leocavalcante
leocavalcante requested a balanced review from Copilot September 29, 2026 21:30
@leocavalcante
leocavalcante merged commit 9c4970a into main Sep 29, 2026
5 checks passed
@leocavalcante
leocavalcante deleted the feat/complex-types branch September 29, 2026 21:32

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

Pointer-to-complex-container required validations still pass analysis and fail during code generation.

Review effort: Balanced
Findings: 1 Medium severity

Open (1)
Resolved since last review (1)
Files not reviewed (4)
  • internal/codegenerator/generated_function_code_no_pointer_test.go: Generated file
  • internal/codegenerator/generated_validation_code_no_pointer_test.go: Generated file
  • tests/endtoend/generated_endtoend_no_pointer_tests.go: Generated file
  • tests/endtoend/validator__.go: Generated file


// Scalar complex pointers have no condition-table row. Reject them here
// so analysis does not accept a tag that generation cannot emit.
if pointer && normalized == "<COMPLEX>" {
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request go Pull requests that update go code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Implement support for complex types

2 participants