#!/usr/bin/perl -w

# Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1.  Redistributions of source code must retain the above copyright
#     notice, this list of conditions and the following disclaimer.
# 2.  Redistributions in binary form must reproduce the above copyright
#     notice, this list of conditions and the following disclaimer in the
#     documentation and/or other materials provided with the distribution.
# 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
#     its contributors may be used to endorse or promote products derived
#     from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

# Used for splitting a single file into multiple class files
# Usage: split-class <header file>

use strict;
use File::Copy;
use FindBin;
use lib $FindBin::Bin;
use SpacingHeuristics;


for my $filename (@ARGV) {

    $filename =~ m/^(\w+)\.h$/ or die "Command line args must be .h files.\n";
    my $basename = $1;

    open(OLDFILE, "<", $filename) or die "File does not exist: $filename\n";
    print "Splitting class $filename.{h,cpp}:\n";

    my $currentClassName = "";
    my $classIndent = "";
    my $fileContent = "";
    my %classDefs = ();
    while (my $line = <OLDFILE>) {
        if ($currentClassName) {
            $classDefs{$currentClassName} .= $line;
            if ($line =~ /^$classIndent};\s*$/) {
                $currentClassName = "";
            }
        } else {
            if ($line =~ /^(\s*)class\s+(\w+)\s+[^;]*$/) {
                $classIndent = $1;
                $currentClassName = $2;
                $classDefs{$currentClassName} .= $line;
                $fileContent .= "###CLASS###$currentClassName\n";
            } else {
                $fileContent .= $line;
            }
        }
    }
    close(OLDFILE);

    if (scalar(keys(%classDefs)) == 1) { # degenerate case
        my ($classname) = keys(%classDefs);
        if (!($classname eq $basename)) {
            print "Skipping $filename, already correctly named.\n";
        } else {
            print "$filename only includes one class, renaming to $classname.h\n";
            system("svn rm --force $classname.h") if (-r "$classname.h");
            system "svn mv $basename.h $classname.h";
        }
    } else {
        while (my ($classname, $classDef) = each(%classDefs)) {
            if (($classname eq $basename)) {
                print "Skipping $filename, already correctly named.\n";
            } else {
                print "Using SVN to copy $basename.{h,cpp} to $classname.{h,cpp}\n";

                system("svn rm --force $classname.h") if (-r "$classname.h");
                system "svn cp $basename.h $classname.h";

                system("svn rm --force $classname.cpp") if (-r "$classname.cpp");
                system "svn cp $basename.cpp $classname.cpp";
            }

            print "Fixing $classname.h as much as possible.\n";
            open(NEWHEADER, ">", "$classname.h") or die "File does not exist: $filename\n";
            my @lines = split("\n", $fileContent);
            foreach my $line (@lines) {
                if ($line =~ /^###CLASS###(\w+)/) {
                    if ($1 eq $classname) {
                        print NEWHEADER $classDef . "\n";
                    }
                } else {
                    print NEWHEADER $line . "\n";
                }
            }
            close(NEWHEADER);

            print "Fixing $classname.cpp as much as possible.\n";
            copy("$classname.cpp", "$classname.cpp.original");
            open(OLDCPP, "<", "$classname.cpp.original") or die "Failed to copy file for reading: $filename\n";
            open(NEWCPP, ">", "$classname.cpp") or die "File does not exist: $filename\n";
            my $insideMemberFunction = 0;
            my $shouldPrintMemberFunction = 0;
            resetSpacingHeuristics();
            while (my $line = <OLDCPP>) {
                if ($insideMemberFunction) {
                    if ($shouldPrintMemberFunction) {
                        print NEWCPP $line;
                        #setPreviousAllowedLine($line);
                    } else {
                        ignoringLine($line);
                    }
                    if ($line =~ /^}\s*$/) {
                        $insideMemberFunction = 0;
                    }
                } elsif ($line =~ /$filename/) {
                    print NEWCPP "#include \"config.h\"\n";
                    print NEWCPP "#include \"$classname.h\"\n";
                } elsif ($line =~ /#include/ || $line =~ /#import/) {
                    next; # skip includes, they're generally wrong or unecessary anyway.
                } else {
                    $line =~ s/DOM:://;
                    $line =~ s/khtml:://;
                    $line =~ s/namespace DOM/namespace WebCore/;
                    $line =~ s/namespace khtml/namespace WebCore/;

                    if ($line =~ /^(.*?\s+)?(\*|&)?(\w+)::(~)?\w+\s*\(/) {
                        $insideMemberFunction = 1;
                        $shouldPrintMemberFunction = ($classname eq $3);
                        if ($shouldPrintMemberFunction) {
                            printPendingEmptyLines(*NEWCPP, $line);
                            print NEWCPP $line;
                        }
                    } else {
                        next if isOnlyWhiteSpace($line);
                        next if ($line =~ m/------------/);
                        printPendingEmptyLines(*NEWCPP, $line);
                        applySpacingHeuristicsAndPrint(*NEWCPP, $line);
                    }
                }
            }
            close(NEWCPP);
            close(OLDCPP);
            unlink("$classname.cpp.original");
        }
    }

    print "Opening new files...\n";
    system("open " . join(".* ", keys(%classDefs)) . ".*");
}