mirror of
https://github.com/safishamsi/graphify.git
synced 2026-07-14 19:37:12 +00:00
b8f41c77eb
Function calls (`y = f(x)`) were silently dropped — only `subroutine_call` (`call sub(...)`) was handled in walk_calls. tree-sitter-fortran represents a function invocation as a `call_expression`, which had no branch, so every function-to-function call produced no edge. Handle `call_expression`. Because Fortran uses the same `name(...)` syntax for array indexing, the callee is resolved against procedures defined in the file (`target_nid in seen_ids`) before emitting — so array accesses like `arr(i)` cannot fabricate spurious `calls` edges. Adds a function + caller to the fixture and a regression test. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
71 lines
1.3 KiB
Fortran
71 lines
1.3 KiB
Fortran
module geometry
|
|
use constants
|
|
implicit none
|
|
|
|
real, parameter :: PI = 3.14159
|
|
|
|
type :: Point
|
|
real :: x
|
|
real :: y
|
|
end type Point
|
|
|
|
contains
|
|
|
|
subroutine circle_area(radius, area)
|
|
real, intent(in) :: radius
|
|
real, intent(out) :: area
|
|
area = PI * radius * radius
|
|
end subroutine circle_area
|
|
|
|
function distance(x1, y1, x2, y2) result(d)
|
|
real, intent(in) :: x1, y1, x2, y2
|
|
real :: d
|
|
d = sqrt((x2 - x1)**2 + (y2 - y1)**2)
|
|
end function distance
|
|
|
|
subroutine translate(p, dx, dy)
|
|
type(Point), intent(inout) :: p
|
|
real, intent(in) :: dx, dy
|
|
p%x = p%x + dx
|
|
p%y = p%y + dy
|
|
end subroutine translate
|
|
|
|
function origin() result(p)
|
|
type(Point) :: p
|
|
p%x = 0.0
|
|
p%y = 0.0
|
|
end function origin
|
|
|
|
subroutine print_area(radius)
|
|
real, intent(in) :: radius
|
|
real :: area
|
|
call circle_area(radius, area)
|
|
print *, "Area =", area
|
|
end subroutine print_area
|
|
|
|
function double_val(x) result(y)
|
|
real, intent(in) :: x
|
|
real :: y
|
|
y = x * 2.0
|
|
end function double_val
|
|
|
|
subroutine report(radius)
|
|
real, intent(in) :: radius
|
|
real :: scaled
|
|
scaled = double_val(radius)
|
|
print *, scaled
|
|
end subroutine report
|
|
|
|
end module geometry
|
|
|
|
|
|
program main
|
|
use geometry
|
|
implicit none
|
|
|
|
real :: r, a
|
|
r = 5.0
|
|
call circle_area(r, a)
|
|
print *, "Circle area:", a
|
|
end program main
|