#!/bin/sh
#!perl -w # --*- Perl -*--
eval 'exec perl -x $0 ${1+"$@"}'
    if 0;
#------------------------------------------------------------------------------
#$Author: andrius $
#$Date: 2020-08-11 03:57:38 -0400 (Tue, 11 Aug 2020) $ 
#$Revision: 45 $
#$URL: svn://saulius-grazulis.lt/mkdepend/trunk/mkjavadepend $
#------------------------------------------------------------------------------
#*
#  Create dependencies for Java files
#**

use strict;
use warnings;
use File::Find;

my( $input_dir, $output_dir ) = @ARGV;

$input_dir  = '.' unless $input_dir;
$output_dir = $input_dir unless $output_dir;

$output_dir =~ s/\/$//;

my @class_files;
find(
    sub {
        if( !-d $File::Find::name && $File::Find::name =~ /\.java$/ ) {
            push @class_files, $File::Find::name;
        } },
    ( $input_dir ) );

my $dependencies = {};
for my $filename (@class_files) {
    my $class = java2class( $filename );

    open( my $inp, $filename );
    while (<$inp>) {
        if( /^\s*(?:public\s+)?class\s+\S+\s+extends\s+(\S+)/ ||
            /^\s*(?:.*\s)?(?:new\s|=)\s*(\w+)/ ) {
            my $extends = $1;
            my( $dependency ) =
                map { java2class( $_ ) }
                grep { /^(?:.+\/)?$extends\.java$/ }
                     @class_files;
            if( $dependency && $class ne $dependency ) {
                $dependencies->{$class}{$dependency} = 1;
            }
        }

        if( /^\s*import\s+([\w\.]+)/ ) {
            my $path = $1;
            $path =~ s/\./\//g;
            my( $dependency ) =
                map { java2class( $_ ) }
                grep { m|$path\.java$| }
                     @class_files;
            if( $dependency && $class ne $dependency ) {
                $dependencies->{$class}{$dependency} = 1;
            }
        }
    }
    close $inp;
}

local $, = ' ';
local $\ = "\n";
for my $class (sort keys %$dependencies) {
    print "$class:", sort keys %{$dependencies->{$class}};
}

sub java2class
{
    my( $java_file ) = @_;
    my $class_file = $java_file;
    $class_file =~ s/\.java$/.class/;

    my @path_parts = split /\//, $class_file;
    $path_parts[0] = $output_dir;
    return join '/', @path_parts;
}
