#!/usr/bin/env perl

# 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 warnings;
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)) . ".*");
}