#!/usr/bin/perl -w

# Copyright (C) 2006 Apple 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 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)) . ".*");
}