From 965926e135b48815080c18a842b1ca48e187ae5d Mon Sep 17 00:00:00 2001 From: fdbozzo Date: Sat, 9 Aug 2014 14:39:32 +0200 Subject: [PATCH 1/2] =?UTF-8?q?Changeset:=20398=20fdbozzo=20-=2008/08/2014?= =?UTF-8?q?=2016:16:51:=20-=20Arreglo=20bug=20orden=20de=20m=C3=A9todos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TESTS/DATOS_READONLY/lib_controles.vc2 | 4 +- TESTS/ut__foxbin2prg.prg | 3 +- foxbin2prg.prg | 316 +++++++++++++++++++------ 3 files changed, 253 insertions(+), 70 deletions(-) diff --git a/TESTS/DATOS_READONLY/lib_controles.vc2 b/TESTS/DATOS_READONLY/lib_controles.vc2 index d4f4f4b..4027987 100644 --- a/TESTS/DATOS_READONLY/lib_controles.vc2 +++ b/TESTS/DATOS_READONLY/lib_controles.vc2 @@ -3486,7 +3486,7 @@ DEFINE CLASS f_combobox AS f_base OF "lib_controles.vcx" WhatsThisHelpID = -1, ; Width = 200 *< END OBJECT: BaseClass="combobox" /> - + PROCEDURE Cl_ComboDropdown1.Init this.AddListItem('Este es el valor.A1') this.AddListItem('Este es el valor.A2', this.NewItemId, 2) @@ -13870,7 +13870,7 @@ DEFINE CLASS f_listbox AS f_base OF "lib_controles.vcx" WhatsThisHelpID = -1, ; Width = 224 *< END OBJECT: BaseClass="listbox" /> - + PROCEDURE Cl_ListBox1.Init this.AddListItem('Este es el valor.A1') this.AddListItem('Este es el valor.A2', this.NewItemId, 2) diff --git a/TESTS/ut__foxbin2prg.prg b/TESTS/ut__foxbin2prg.prg index 81a72b7..d64e5ef 100644 --- a/TESTS/ut__foxbin2prg.prg +++ b/TESTS/ut__foxbin2prg.prg @@ -148,6 +148,7 @@ DEFINE CLASS ut__foxbin2prg AS FxuTestCase OF FxuTestCase.prg loObj.get_PropsFrom_PROTECTED( toReg_Esperado.PROTECTED, .F., @laProtected_Esperado, @lnProtected_Count_Esperado, '' ) *-- Methods + STORE 0 TO lnMethods_Count, lnMethods_Count_Esperado loObj.get_ADD_OBJECT_METHODS( toReg, toReg, '', @laMethods, '', @lnMethods_Count, '', 0, '', 0, loFoxBin2Prg ) loObj.get_ADD_OBJECT_METHODS( toReg_Esperado, toReg_Esperado, '', @laMethods_Esperado, '', @lnMethods_Count_Esperado, '', 0, '', 0, loFoxBin2Prg ) lcExtraData = tcParent + '.' + tcObjName + ' (' + tcClass + ')' @@ -256,7 +257,7 @@ DEFINE CLASS ut__foxbin2prg AS FxuTestCase OF FxuTestCase.prg THIS.assertequals( lnMethods_Count_Esperado, lnMethods_Count, "Cantidad de METHODS para " + lcExtraData ) FOR I = 1 TO lnMethods_Count_Esperado - THIS.asserttrue( ASCAN( laMethods, laMethods_Esperado(I,1), 1, -1, 1, 0+2+4) > 0 ; + THIS.asserttrue( ASCAN( laMethods, laMethods_Esperado(I,1), 1, -1, 1, 1+2+4) > 0 ; , ' Comprobación de que existe el Method "' + TRANSFORM(laMethods_Esperado(I,1)) + '"' + " para " + lcExtraData ) ENDFOR diff --git a/foxbin2prg.prg b/foxbin2prg.prg index 176702e..4f0ab70 100644 --- a/foxbin2prg.prg +++ b/foxbin2prg.prg @@ -8170,12 +8170,14 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base + [] ; + [] ; + [] ; + + [] ; + [] ; + [] ; + [] ; + [] ; + [] ; + [] ; + + [] ; + [] ; + [] ; + [] ; @@ -8239,17 +8241,18 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base #ENDIF TRY - LOCAL lcMethodName + LOCAL lcMethodName, lnMethodCount WITH THIS AS c_conversor_bin_a_prg OF 'FOXBIN2PRG.PRG' - .SortMethod( toRegObj.METHODS, @taMethods, @taCode, '', @tnMethodCount ; + lnMethodCount = tnMethodCount + .Method2Array( toRegObj.METHODS, @taMethods, @taCode, '', @tnMethodCount ; , @taPropsAndComments, tnPropsAndComments_Count, @taProtected, tnProtected_Count, @toFoxBin2Prg ) *-- Ubico los métodos protegidos y les cambio la definición. *-- Los métodos se deben generar con la ruta completa, porque si no es imposible saber a que objeto corresponden, *-- o si son de la clase. - IF tnMethodCount > 0 THEN - FOR I = 1 TO tnMethodCount + IF tnMethodCount - lnMethodCount > 0 THEN + FOR I = lnMethodCount + 1 TO tnMethodCount IF taMethods(I,2) = 0 LOOP ENDIF @@ -8272,9 +8275,11 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base *-- Genero el método SIN indentar, ya que se hace luego *-- Sustituyo el TEXT/ENDTEXT aquí porque a veces quita espacios de la derecha, y eso es peligroso - tcMethods = tcMethods + CR_LF + 'PROCEDURE ' + lcMethodName - tcMethods = tcMethods + CR_LF + .IndentarMemo( taCode(taMethods(I,2)) ) - tcMethods = tcMethods + CR_LF + 'ENDPROC' + *tcMethods = tcMethods + CR_LF + 'PROCEDURE ' + lcMethodName + *tcMethods = tcMethods + CR_LF + .IndentarMemo( taCode(taMethods(I,2)) ) + *tcMethods = tcMethods + CR_LF + 'ENDPROC' + taCode(taMethods(I,2)) = 'PROCEDURE ' + lcMethodName + CR_LF + .IndentarMemo( taCode(taMethods(I,2)) ) + CR_LF + 'ENDPROC' + taMethods(I,1) = lcMethodName ENDFOR ENDIF ENDWITH && THIS @@ -8291,6 +8296,93 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ENDPROC + ******************************************************************************************************************* + PROCEDURE get_CLASS_METHODS + LPARAMETERS tnMethodCount, taMethods, taCode, taProtected, taPropsAndComments + *-- DEFINIR MÉTODOS DE LA CLASE + *-- Ubico los métodos protegidos y les cambio la definición + EXTERNAL ARRAY taMethods, taCode, taProtected, taPropsAndComments + + TRY + LOCAL lcMethod, lcMethodName, lnProtectedItem, lnCommentRow, lcProcDef, lcMethods, lnLen + STORE '' TO lcMethod, lcMethodName, lcProcDef, lcMethods + + IF tnMethodCount > 0 THEN + WITH THIS AS c_conversor_bin_a_prg OF 'FOXBIN2PRG.PRG' + FOR I = 1 TO tnMethodCount + lcMethodName = CHRTRAN( taMethods(I,1), '^', '' ) + lnProtectedItem = ASCAN( taProtected, taMethods(I,1), 1, 0, 0, 1+2+4) + + IF lnProtectedItem = 0 + lnProtectedItem = ASCAN( taProtected, taMethods(I,1) + '^', 1, 0, 0, 1+2+4) + + IF lnProtectedItem = 0 + *-- Método común + lcProcDef = 'PROCEDURE' + ELSE + *-- Método oculto + lcProcDef = 'HIDDEN PROCEDURE' + ENDIF + ELSE + *-- Método protegido + lcProcDef = 'PROTECTED PROCEDURE' + ENDIF + + lnCommentRow = ASCAN( taPropsAndComments, '*' + lcMethodName, 1, 0, 1, 1+2+4+8) + + *-- Nombre del método + *TEXT TO lcMethods ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + * <<>> <> <> + *ENDTEXT + *lcMethods = lcMethods + CR_LF + lcProcDef + ' ' + taMethods(I,1) + lcMethod = lcProcDef + ' ' + taMethods(I,1) + + *-- Comentarios del método (si tiene) + IF lnCommentRow > 0 AND NOT EMPTY(taPropsAndComments(lnCommentRow,2)) + *TEXT TO lcMethods ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + * <<>> && <> + *ENDTEXT + *lcMethods = lcMethods + C_TAB + C_TAB + taPropsAndComments(lnCommentRow,2) + lcMethod = lcMethod + C_TAB + C_TAB + '&' + '& ' + taPropsAndComments(lnCommentRow,2) + ENDIF + + *-- Código del método + IF taMethods(I,2) > 0 THEN + *lcMethods = lcMethods + CR_LF + .IndentarMemo( taCode(taMethods(I,2)), C_TAB + C_TAB ) + *lcMethod = lcMethod + CR_LF + .IndentarMemo( taCode(taMethods(I,2)), C_TAB + C_TAB ) + taCode(taMethods(I,2)) = lcMethod + CR_LF + .IndentarMemo( taCode(taMethods(I,2)) ) + CR_LF + 'ENDPROC' + ELSE + lnLen = ALEN(taCode,1) + 1 + DIMENSION taCode( lnLen ) + taCode( lnLen ) = lcMethod + CR_LF + 'ENDPROC' + taMethods(I,2) = lnLen + ENDIF + + *lcMethods = lcMethods + CR_LF + C_TAB + 'ENDPROC' + *lcMethods = lcMethods + CR_LF + + *lcMethod = lcMethod + CR_LF + C_TAB + 'ENDPROC' + *lcMethod = lcMethod + CR_LF + *lcMethods = lcMethods + lcMethod + ENDFOR + + ENDWITH && THIS + *C_FB2PRG_CODE = C_FB2PRG_CODE + C_TAB + lcMethods &&+ CR_LF + + ENDIF + + CATCH TO loEx + IF THIS.l_Debug AND _VFP.STARTMODE = 0 + SET STEP ON + ENDIF + + THROW + ENDTRY + + RETURN + ENDPROC + + ******************************************************************************************************************* PROCEDURE get_NombresObjetosOLEPublic LPARAMETERS ta_NombresObjsOle @@ -8511,16 +8603,18 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ******************************************************************************************************************* PROCEDURE IndentarMemo - LPARAMETERS tcMethod, tcIndentation + LPARAMETERS tcMethod, tcIndentation, tlKeepProcHeader *-- INDENTA EL CÓDIGO DE UN MÉTODO DADO Y QUITA LA CABECERA DE MÉTODO (PROCEDURE/ENDPROC) SI LA ENCUENTRA TRY - LOCAL I, X, lcMethod, llProcedure, lnInicio, lnFin, laLineas(1) + LOCAL I, X, lcMethod, llProcedure, lnInicio, lnFin, laLineas(1), lnOffset lcMethod = '' - llProcedure = ( LEFT(tcMethod,10) == 'PROCEDURE ' ; - OR LEFT(tcMethod,17) == 'HIDDEN PROCEDURE ' ; - OR LEFT(tcMethod,20) == 'PROTECTED PROCEDURE ' ) lnInicio = 1 + lnOffset = 0 lnFin = ALINES(laLineas, tcMethod) + llProcedure = ( LEFT(laLineas(1),10) == 'PROCEDURE ' ; + OR LEFT(laLineas(1),17) == 'HIDDEN PROCEDURE ' ; + OR LEFT(laLineas(1),20) == 'PROTECTED PROCEDURE ' ) + IF VARTYPE(tcIndentation) # 'C' tcIndentation = '' ENDIF @@ -8546,15 +8640,20 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base *-- Si encuentra la cabecera de un PROCEDURE, la saltea IF llProcedure - lnInicio = 2 - lnFin = lnFin - 1 + lnOffset = 1 ENDIF - FOR I = lnInicio TO lnFin + FOR I = lnInicio + lnOffset TO lnFin - lnOffset *-- TEXT/ENDTEXT aquí da error 2044 de recursividad. No usar. lcMethod = lcMethod + CR_LF + tcIndentation + laLineas(I) ENDFOR + IF llProcedure AND tlKeepProcHeader + laLineas(lnInicio) = C_TAB + laLineas(lnInicio) + laLineas(lnFin) = C_TAB + laLineas(lnFin) + lcMethod = CR_LF + laLineas(lnInicio) + lcMethod + CR_LF + laLineas(lnFin) + ENDIF + lcMethod = SUBSTR(lcMethod,3) && Quito el primer ENTER (CR+LF) CATCH TO loEx @@ -8632,6 +8731,75 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ******************************************************************************************************************* PROCEDURE SortMethod + LPARAMETERS tcMethod, taMethods, taCode, tcSorted, tnMethodCount, taPropsAndComments, tnPropsAndComments_Count ; + , taProtected, tnProtected_Count, toFoxBin2Prg + + EXTERNAL ARRAY taMethods, taCode, taPropsAndComments, taProtected + #IF .F. + LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' + #ENDIF + + TRY + LOCAL I, I2, laMethods(1,3), lnDeleted, lcMethodName, lnMethodPos, lcMethodType, loEx AS EXCEPTION + + IF tnMethodCount > 0 THEN + + *-- taMethods[1,3] + *-- 1.Nombre Método + *-- 2.Posición Original + *-- 3.Tipo (HIDDEN/PROTECTED/NORMAL) + + *-- Alphabetical ordering of methods + IF THIS.l_MethodSort_Enabled + ASORT(taMethods,1,-1,0,1) + ENDIF + + *FOR I = 1 TO tnMethodCount + * IF taMethods(I,2) > 0 THEN + * tcSorted = m.tcSorted + taCode( taMethods(I,2) ) + * ENDIF + *ENDFOR + + DIMENSION laMethods(tnMethodCount,3) + lnDeleted = 0 + + FOR I = tnMethodCount TO 1 STEP -1 + IF taMethods(I,2) > 0 THEN + IF '.' $ taMethods(I,1) + *-- Los métodos con '.' los mando a otro array + lnDeleted = lnDeleted + 1 + laMethods(lnDeleted,1) = taMethods(I,1) + laMethods(lnDeleted,2) = taMethods(I,2) + laMethods(lnDeleted,3) = taMethods(I,3) + ADEL( taMethods, I ) + ENDIF + ENDIF + ENDFOR + + FOR I = lnDeleted TO 1 STEP -1 + *-- Los métodos con '.' los paso al final + I2 = tnMethodCount - lnDeleted + (lnDeleted - I) + 1 + taMethods(I2,1) = laMethods(I,1) + taMethods(I2,2) = laMethods(I,2) + taMethods(I2,3) = laMethods(I,3) + ENDFOR + + ENDIF + + CATCH TO loEx + IF THIS.l_Debug AND _VFP.STARTMODE = 0 + SET STEP ON + ENDIF + + THROW + ENDTRY + + RETURN + ENDPROC && SordMethod + + + ******************************************************************************************************************* + PROCEDURE Method2Array LPARAMETERS tcMethod, taMethods, taCode, tcSorted, tnMethodCount, taPropsAndComments, tnPropsAndComments_Count ; , taProtected, tnProtected_Count, toFoxBin2Prg *-- 29/10/2013 Fernando D. Bozzo @@ -8653,18 +8821,20 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base LOCAL lnLineCount, laLine(1), I, lnTextNodes, tcSorted, lnProtectedLine, lcMethod, lnLine_Len, lcLine, llProcOpen ; , laLineasExclusion(1), lnBloquesExclusion ; , loEx AS EXCEPTION - DIMENSION taMethods(1,3) - STORE '' TO taMethods, tcSorted, taCode - tnMethodCount = 0 + *DIMENSION taMethods(1,3) + *STORE '' TO taMethods, tcSorted, taCode + *tnMethodCount = 0 IF NOT EMPTY(m.tcMethod) AND LEFT(m.tcMethod,9) == "ENDPROC"+CHR(13)+CHR(10) tcMethod = SUBSTR(m.tcMethod,10) ENDIF IF NOT EMPTY(m.tcMethod) - DIMENSION laLine(1), taMethods(1,3) - STORE '' TO laLine, taMethods, taCode - STORE 0 TO tnMethodCount, lnTextNodes + DIMENSION laLine(1) &&, taMethods(1,3) + STORE '' TO laLine + STORE 0 TO lnTextNodes + *STORE '' TO taMethods, taCode + *STORE 0 TO tnMethodCount lnLineCount = ALINES(laLine, m.tcMethod) && NO aplicar nungún formato ni limpieza, que es el CÓDIGO FUENTE @@ -8749,7 +8919,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base LOOP ENDIF - taCode(tnMethodCount) = taCode(tnMethodCount) + laLine(I) + CR_LF + taCode(tnMethodCount) = taCode(tnMethodCount) + laLine(I) &&+ CR_LF llProcOpen = .F. CASE tnMethodCount = 0 OR NOT llProcOpen AND LEFT( LTRIM(laLine(I)),1 ) = '*' @@ -8790,18 +8960,6 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ENDIF ENDIF ENDFOR - - *-- Alphabetical ordering of methods - IF THIS.l_MethodSort_Enabled - ASORT(taMethods,1,-1,0,1) - ENDIF - - FOR I = 1 TO tnMethodCount - IF taMethods(I,2) > 0 THEN - m.tcSorted = m.tcSorted + taCode(taMethods(I,2)) - ENDIF - ENDFOR - ENDIF CATCH TO loEx @@ -8813,7 +8971,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ENDTRY RETURN - ENDPROC && SordMethod + ENDPROC && Method2Array ******************************************************************************************************************* @@ -8894,29 +9052,33 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ******************************************************************************************************************* PROCEDURE write_ALL_OBJECT_METHODS - LPARAMETERS tcMethods, taPropsAndComments, tnPropsAndComments_Count, taProtected, tnProtected_Count, toFoxBin2Prg + LPARAMETERS tcMethods, taMethods, taCode, tnMethodCount, taPropsAndComments, tnPropsAndComments_Count, taProtected, tnProtected_Count, toFoxBin2Prg *-- Finalmente, todos los métodos los ordeno y escribo juntos LOCAL laMethods(1), laCode(1), lnMethodCount, I, lcMethods - IF NOT EMPTY(tcMethods) + IF tnMethodCount > 0 THEN STORE '' TO lcMethods DIMENSION laMethods(1,3) WITH THIS AS c_conversor_bin_a_prg OF 'FOXBIN2PRG.PRG' - .SortMethod( @tcMethods, @laMethods, @laCode, '', @lnMethodCount ; + .SortMethod( @tcMethods, @taMethods, @taCode, '', @tnMethodCount ; , @taPropsAndComments, tnPropsAndComments_Count, @taProtected, tnProtected_Count, @toFoxBin2Prg ) - FOR I = 1 TO lnMethodCount + lcMethods = C_TAB + + FOR I = 1 TO tnMethodCount *-- Genero los métodos indentados *-- Sustituyo el TEXT/ENDTEXT aquí porque a veces quita espacios de la derecha, y eso es peligroso - IF laMethods(I,2) = 0 + IF taMethods(I,2) = 0 LOOP ENDIF - lcMethods = lcMethods + CR_LF + C_TAB + laMethods(I,3) + C_PROCEDURE + ' ' + laMethods(I,1) - lcMethods = lcMethods + CR_LF + .IndentarMemo( laCode(laMethods(I,2)), CHR(9) + CHR(9) ) - lcMethods = lcMethods + CR_LF + C_TAB + C_ENDPROC + *lcMethods = lcMethods + CR_LF + C_TAB + laMethods(I,3) + C_PROCEDURE + ' ' + laMethods(I,1) + *lcMethods = lcMethods + CR_LF + .IndentarMemo( laCode(laMethods(I,2)), CHR(9) + CHR(9) ) + *lcMethods = lcMethods + CR_LF + C_TAB + C_ENDPROC + + lcMethods = lcMethods + CR_LF + .IndentarMemo( taCode(taMethods(I,2)), CHR(9) + CHR(9), .T. ) lcMethods = lcMethods + CR_LF ENDFOR ENDWITH && THIS @@ -8936,13 +9098,13 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base EXTERNAL ARRAY taMethods, taCode, taProtected, taPropsAndComments TRY - LOCAL lcMethod, lnProtectedItem, lnCommentRow, lcProcDef, lcMethods - STORE '' TO lcMethod, lcProcDef, lcMethods + LOCAL lcMethod, lcMethodName, lnProtectedItem, lnCommentRow, lcProcDef, lcMethods + STORE '' TO lcMethod, lcMethodName, lcProcDef, lcMethods IF tnMethodCount > 0 THEN WITH THIS AS c_conversor_bin_a_prg OF 'FOXBIN2PRG.PRG' FOR I = 1 TO tnMethodCount - lcMethod = CHRTRAN( taMethods(I,1), '^', '' ) + lcMethodName = CHRTRAN( taMethods(I,1), '^', '' ) lnProtectedItem = ASCAN( taProtected, taMethods(I,1), 1, 0, 0, 1+2+4) IF lnProtectedItem = 0 @@ -8960,28 +9122,35 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base lcProcDef = 'PROTECTED PROCEDURE' ENDIF - lnCommentRow = ASCAN( taPropsAndComments, '*' + lcMethod, 1, 0, 1, 1+2+4+8) + lnCommentRow = ASCAN( taPropsAndComments, '*' + lcMethodName, 1, 0, 1, 1+2+4+8) *-- Nombre del método - TEXT TO lcMethods ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 - <<>> <> <> - ENDTEXT + *TEXT TO lcMethods ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + * <<>> <> <> + *ENDTEXT + *lcMethods = lcMethods + CR_LF + lcProcDef + ' ' + taMethods(I,1) + lcMethod = CR_LF + lcProcDef + ' ' + taMethods(I,1) *-- Comentarios del método (si tiene) IF lnCommentRow > 0 AND NOT EMPTY(taPropsAndComments(lnCommentRow,2)) - TEXT TO lcMethods ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 - <<>> && <> - ENDTEXT + *TEXT TO lcMethods ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + * <<>> && <> + *ENDTEXT + *lcMethods = lcMethods + C_TAB + C_TAB + taPropsAndComments(lnCommentRow,2) + lcMethod = lcMethod + C_TAB + C_TAB + taPropsAndComments(lnCommentRow,2) ENDIF *-- Código del método - *-- Sustituyo el TEXT/ENDTEXT aquí porque a veces quita espacios de la derecha, y eso es peligroso IF taMethods(I,2) > 0 THEN - lcMethods = lcMethods + CR_LF + .IndentarMemo( taCode(taMethods(I,2)), C_TAB + C_TAB ) + *lcMethods = lcMethods + CR_LF + .IndentarMemo( taCode(taMethods(I,2)), C_TAB + C_TAB ) + lcMethod = lcMethod + CR_LF + .IndentarMemo( taCode(taMethods(I,2)), C_TAB + C_TAB ) ENDIF - lcMethods = lcMethods + CR_LF + C_TAB + 'ENDPROC' - lcMethods = lcMethods + CR_LF + *lcMethods = lcMethods + CR_LF + C_TAB + 'ENDPROC' + *lcMethods = lcMethods + CR_LF + lcMethod = lcMethod + CR_LF + C_TAB + 'ENDPROC' + lcMethod = lcMethod + CR_LF + lcMethods = lcMethods + lcMethod ENDFOR ENDWITH && THIS @@ -9889,6 +10058,10 @@ DEFINE CLASS c_conversor_vcx_a_prg AS c_conversor_bin_a_prg SCAN ALL FOR TABLABIN.PLATFORM = "WINDOWS" AND TABLABIN.RESERVED1=="Class" + STORE 0 TO lnMethodCount + STORE '' TO laMethods, laCode + + loRegClass = NULL SCATTER MEMO NAME loRegClass IF toFoxBin2Prg.l_NoTimestamps @@ -9964,12 +10137,15 @@ DEFINE CLASS c_conversor_vcx_a_prg AS c_conversor_bin_a_prg *-- OBTENGO LOS MÉTODOS DE LA CLASE PARA POSTERIOR TRATAMIENTO - DIMENSION laMethods(1,3) - laMethods = '' - .SortMethod( loRegClass.METHODS, @laMethods, @laCode, '', @lnMethodCount ; + DIMENSION laMethods(1,3), laCode(1) + STORE '' TO laMethods, laCode + lnMethodCount = 0 + + .Method2Array( loRegClass.METHODS, @laMethods, @laCode, '', @lnMethodCount ; , @laPropsAndComments, lnPropsAndComments_Count, @laProtected, lnProtected_Count, @toFoxBin2Prg ) - .write_CLASS_METHODS( @lnMethodCount, @laMethods, @laCode, @laProtected, @laPropsAndComments ) + *.write_CLASS_METHODS( @lnMethodCount, @laMethods, @laCode, @laProtected, @laPropsAndComments ) + .get_CLASS_METHODS( @lnMethodCount, @laMethods, @laCode, @laProtected, @laPropsAndComments ) lnLastClass = 1 lcMethods = '' @@ -9998,7 +10174,7 @@ DEFINE CLASS c_conversor_vcx_a_prg AS c_conversor_bin_a_prg , @laPropsAndComments, lnPropsAndComments_Count, @laProtected, lnProtected_Count, @toFoxBin2Prg ) ENDSCAN - .write_ALL_OBJECT_METHODS( @lcMethods, @laPropsAndComments, lnPropsAndComments_Count, @laProtected ; + .write_ALL_OBJECT_METHODS( @lcMethods, @laMethods, @laCode, @lnMethodCount, @laPropsAndComments, lnPropsAndComments_Count, @laProtected ; , lnProtected_Count, @toFoxBin2Prg ) GOTO RECORD (lnRecno) @@ -10125,6 +10301,9 @@ DEFINE CLASS c_conversor_scx_a_prg AS c_conversor_bin_a_prg AND (EMPTY(TABLABIN.PARENT) ; AND (TABLABIN.BASECLASS == 'dataenvironment' OR TABLABIN.BASECLASS == 'form' OR TABLABIN.BASECLASS == 'formset' ) ) + STORE 0 TO lnMethodCount + STORE '' TO laMethods, laCode + loRegClass = NULL SCATTER MEMO NAME loRegClass @@ -10202,12 +10381,15 @@ DEFINE CLASS c_conversor_scx_a_prg AS c_conversor_bin_a_prg *-- OBTENGO LOS MÉTODOS DE LA CLASE PARA POSTERIOR TRATAMIENTO - DIMENSION laMethods(1,3) - laMethods = '' - .SortMethod( loRegClass.METHODS, @laMethods, @laCode, '', @lnMethodCount ; + DIMENSION laMethods(1,3), laCode(1) + STORE '' TO laMethods, laCode + lnMethodCount = 0 + + .Method2Array( loRegClass.METHODS, @laMethods, @laCode, '', @lnMethodCount ; , @laPropsAndComments, lnPropsAndComments_Count, @laProtected, lnProtected_Count, @toFoxBin2Prg ) - .write_CLASS_METHODS( @lnMethodCount, @laMethods, @laCode, @laProtected, @laPropsAndComments ) + *.write_CLASS_METHODS( @lnMethodCount, @laMethods, @laCode, @laProtected, @laPropsAndComments ) + .get_CLASS_METHODS( @lnMethodCount, @laMethods, @laCode, @laProtected, @laPropsAndComments ) lnLastClass = 1 lcMethods = '' @@ -10238,7 +10420,7 @@ DEFINE CLASS c_conversor_scx_a_prg AS c_conversor_bin_a_prg , @laPropsAndComments, lnPropsAndComments_Count, @laProtected, lnProtected_Count, @toFoxBin2Prg ) ENDSCAN - .write_ALL_OBJECT_METHODS( @lcMethods, @laPropsAndComments, lnPropsAndComments_Count, @laProtected ; + .write_ALL_OBJECT_METHODS( @lcMethods, @laMethods, @laCode, @lnMethodCount, @laPropsAndComments, lnPropsAndComments_Count, @laProtected ; , lnProtected_Count, @toFoxBin2Prg ) GOTO RECORD (lnRecno) From dc5f469354d355c516e49febda71001902461b7e Mon Sep 17 00:00:00 2001 From: fdbozzo Date: Sun, 10 Aug 2014 11:01:05 +0200 Subject: [PATCH 2/2] =?UTF-8?q?Changeset:=20399=20fdbozzo=20-=2009/08/2014?= =?UTF-8?q?=2014:39:34:=20-=20Agregado=20caso=20de=20prueba=20para=20orden?= =?UTF-8?q?=20de=20m=C3=A9todos=20(basado=20en=20el=20enviado=20por=20Ryan?= =?UTF-8?q?)=20-=20Limpieza=20de=20c=C3=B3digo=20-=20Actualizaci=C3=B3n=20?= =?UTF-8?q?de=20historial=20en=20header=20foxbin2prg.prg?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FoxBin2PRGVersionFile.txt | 3 +- TESTS/ut__foxbin2prg.prg | 58 +++++ ...or_base__IdentificarBloquesDeExclusion.prg | 26 ++- foxbin2prg.exe | Bin 442960 -> 444147 bytes foxbin2prg.pj2 | 2 + foxbin2prg.pjt | Bin 602145 -> 609976 bytes foxbin2prg.pjx | Bin 8993 -> 9123 bytes foxbin2prg.prg | 218 ++++-------------- 8 files changed, 128 insertions(+), 179 deletions(-) diff --git a/FoxBin2PRGVersionFile.txt b/FoxBin2PRGVersionFile.txt index 39805a3..a342996 100644 --- a/FoxBin2PRGVersionFile.txt +++ b/FoxBin2PRGVersionFile.txt @@ -18,7 +18,8 @@ Demo video using FoxBin2Prg with PlasticSCM: http://youtu.be/sE4wQ50Itqg Change History ------------------------------------------------------------- 2014/08/07 v1.19.30 -- Bug Fix vcx/scx: Bad EndText block detection when the previous line end with "," or ";" (Jim Nelson) +- Bug Fix vcx/scx: Bad EndText block detection when the previous line ends with "," or ";" (Jim Nelson) +- Bug Fix vcx/scx: Some methods are not alphabetically sorted in some inheritance situations (Ryan Harris) 2014/08/01 v1.19.29 - Bug Fix vcx/scx: Bad Text block detection when the previous line ends with "," (M_N_M) diff --git a/TESTS/ut__foxbin2prg.prg b/TESTS/ut__foxbin2prg.prg index d64e5ef..49ca7ef 100644 --- a/TESTS/ut__foxbin2prg.prg +++ b/TESTS/ut__foxbin2prg.prg @@ -873,6 +873,64 @@ DEFINE CLASS ut__foxbin2prg AS FxuTestCase OF FxuTestCase.prg ENDFUNC + ******************************************************************************************************************************************* + FUNCTION Deberia_Ejecutar_FOXBIN2PRG_ParaLaLibreria_CLASSLIB_METHOD_ORDER_BUG_TEST_VCX_YValidarEl_BUG_DelOrdenDeMetodosDeClases_v1_19_29 + LOCAL lnCodError, lnCodError_Esperado ; + , lc_File, lc_InputFile, lc_OutputFile, lcParent, lcClass, lcObjName, loReg_Esperado, loReg, lcTipoBinario, lcTXT0, lcTXT1 ; + , loModulo AS CL_CLASE OF "FOXBIN2PRG.PRG" ; + , loCnv AS c_foxbin2prg OF "FOXBIN2PRG.PRG" ; + , loEx AS EXCEPTION + #IF .F. + PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG' + #ENDIF + + TRY + loEx = NULL + loCnv = NEWOBJECT("c_foxbin2prg", "FOXBIN2PRG.PRG") + *loCnv.l_Debug = .F. + loCnv.l_ShowErrors = .F. + *loCnv.l_Test = .T. + *loCnv.l_PropSort_Enabled = .F. && Para buscar diferencias + *loCnv.l_MethodSort_Enabled = .F. && Para buscar diferencias + + + *-- DATOS DE ENTRADA + STORE 0 TO lnCodError + lc_File = 'CLASSLIB_METHOD_ORDER_BUG_TEST.VCX' + lc_InputFile = FORCEPATH( lc_File, oFXU_LIB.cPathDatosReadOnly ) + lc_OutputFile = FORCEPATH( lc_File, oFXU_LIB.cPathDatosTest ) + lcTipoBinario = UPPER( JUSTEXT( lc_OutputFile ) ) + + oFXU_LIB.copiarArchivosParaTest( FORCEEXT( lc_File, LEFT( JUSTEXT(lc_File),2 ) + '?' ) ) + + loCnv.Convertir( lc_OutputFile, .F., .F., .T. ) + *loCnv.Convertir( FORCEEXT(lc_OutputFile, LEFT( JUSTEXT(lc_File),2 ) + '2' ), .F., .F., .T. ) + + *-- Comparo resultados + lcTXT0 = FORCEPATH( FORCEEXT(lc_File,'VC2'), ADDBS( oFXU_LIB.cPathDatosReadOnly ) ) + lcTXT1 = FORCEPATH( FORCEEXT(lc_File,'VC2'), ADDBS( oFXU_LIB.cPathDatosTest ) ) + + llEqual = ( FILETOSTR( lcTXT0 ) == FILETOSTR( lcTXT1 ) ) + + THIS.messageout( "Se comparan archivos VC2, para saber si hay cambios" ) + THIS.messageout( "lcTXT0 = " + lcTXT0 ) + THIS.messageout( "lcTXT1 = " + lcTXT1 ) + + THIS.asserttrue( llEqual, "COMPARACIÓN DE VC2" ) + + CATCH TO loEx + THIS.Evaluate_results( loEx, lnCodError_Esperado, lc_OutputFile, lcParent, lcClass, lcObjName, loReg_Esperado ) + + FINALLY + USE IN (SELECT("ARCHIVOBIN_IN")) + USE IN (SELECT("TABLABIN")) + STORE NULL TO loModulo, loCnv + RELEASE loModulo, loCnv + ENDTRY + + ENDFUNC + + ******************************************************************************************************************************************* FUNCTION Deberia_Ejecutar_FOXBIN2PRG_ParaLaLibreria_FB2P_TEST_VCX_YValidarEl_BUG_Del_PROCEDURE_SIN_ENDPROC LOCAL lnCodError, lnCodError_Esperado ; diff --git a/TESTS/ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion.prg b/TESTS/ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion.prg index b5cc86e..df7d0bd 100644 --- a/TESTS/ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion.prg +++ b/TESTS/ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion.prg @@ -72,32 +72,36 @@ DEFINE CLASS ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion as ******************************************************************************************************************************************* FUNCTION Deberia_ObtenerLaUbicacionDelBloque_IF_ENDIF_CuandoCodigoCon_IF_ENDIF_predominante_esEvaluado LOCAL lcMethod, laLineas(1), lnLineas, laPos(1,2), lnPos_Count, laExpected_Pos(2,2) ; - , laLineasExclusion(10), laLineasExclusion_Esperadas(10) + , laLineasExclusion(12), laLineasExclusion_Esperadas(12) LOCAL loObj AS c_conversor_prg_a_bin OF "FOXBIN2PRG.PRG" loObj = THIS.icObj *-- Input and expected params STORE '' TO lcMethod laExpected_Pos(1,1) = 3 - laExpected_Pos(1,2) = 5 - laExpected_Pos(2,1) = 7 - laExpected_Pos(2,2) = 9 + laExpected_Pos(1,2) = 6 + laExpected_Pos(2,1) = 8 + laExpected_Pos(2,2) = 11 laLineasExclusion_Esperadas( 3) = .T. laLineasExclusion_Esperadas( 4) = .T. laLineasExclusion_Esperadas( 5) = .T. laLineasExclusion_Esperadas( 7) = .T. laLineasExclusion_Esperadas( 8) = .T. laLineasExclusion_Esperadas( 9) = .T. + laLineasExclusion_Esperadas(10) = .T. + laLineasExclusion_Esperadas(11) = .T. TEXT TO lcMethod NOSHOW TEXTMERGE FLAGS 1 PRETEXT 1+2 <> myMethod_B *-- Code Block <> <> + value ; <> *-- Code Block <> <> + value , <> <> ENDTEXT @@ -138,7 +142,7 @@ DEFINE CLASS ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion as <> <> <> - *-- Code Block + *-- Code Block ; <> <> <> @@ -159,32 +163,36 @@ DEFINE CLASS ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion as ******************************************************************************************************************************************* FUNCTION Deberia_ObtenerLaUbicacionDelBloque_TEXT_ENDTEXT_CuandoCodigoCon_TEXT_ENDTEXT_predominante_esEvaluado LOCAL lcMethod, laLineas(1), lnLineas, laPos(1,2), lnPos_Count, laExpected_Pos(2,2) ; - , laLineasExclusion(10), laLineasExclusion_Esperadas(10) + , laLineasExclusion(12), laLineasExclusion_Esperadas(12) LOCAL loObj AS c_conversor_prg_a_bin OF "FOXBIN2PRG.PRG" loObj = THIS.icObj *-- Input and expected params STORE '' TO lcMethod laExpected_Pos(1,1) = 3 - laExpected_Pos(1,2) = 5 - laExpected_Pos(2,1) = 7 - laExpected_Pos(2,2) = 9 + laExpected_Pos(1,2) = 6 + laExpected_Pos(2,1) = 8 + laExpected_Pos(2,2) = 11 laLineasExclusion_Esperadas( 3) = .T. laLineasExclusion_Esperadas( 4) = .T. laLineasExclusion_Esperadas( 5) = .T. laLineasExclusion_Esperadas( 7) = .T. laLineasExclusion_Esperadas( 8) = .T. laLineasExclusion_Esperadas( 9) = .T. + laLineasExclusion_Esperadas(10) = .T. + laLineasExclusion_Esperadas(11) = .T. TEXT TO lcMethod NOSHOW TEXTMERGE FLAGS 1 PRETEXT 1+2 <> myMethod_B *-- Code Block <> <> + value ; <> *-- Code Block <> <> + value , <> <> ENDTEXT diff --git a/foxbin2prg.exe b/foxbin2prg.exe index f394ce5d31ed57305b40f8b41893678b6c9ab000..1cb896f228c1878835cd50e62371b357fe85a8f0 100644 GIT binary patch delta 17275 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 diff --git a/foxbin2prg.pj2 b/foxbin2prg.pj2 index d657dc4..9e072a9 100644 --- a/foxbin2prg.pj2 +++ b/foxbin2prg.pj2 @@ -109,6 +109,7 @@ WITH loProject.FILES .ADD('tests\ut__foxbin2prg__c_conversor_prg_a_bin__analizarasignacion_tag_indicado.prg') && *< FileMetadata: Type="P" Cpid="1252" Timestamp="0" ID="0" ObjRev="544" /> .ADD('tests\ut__foxbin2prg__c_conversor_prg_a_bin__insert_allobjects.prg') && *< FileMetadata: Type="P" Cpid="1252" Timestamp="0" ID="0" ObjRev="544" /> .ADD('tests\ut__foxbin2prg__c_foxbin2prg__evaluarconfiguracion.prg') && *< FileMetadata: Type="P" Cpid="1252" Timestamp="0" ID="0" ObjRev="544" /> + .ADD('tests\ut__foxbin2prg__c_foxbin2prg__filenamefoundinfilter.prg') && *< FileMetadata: Type="P" Cpid="1252" Timestamp="0" ID="0" ObjRev="0" /> * .ITEM('__newproject.f2b').Remove() @@ -137,6 +138,7 @@ WITH loProject.FILES .ITEM(lcCurdir + 'tests\ut__foxbin2prg__c_conversor_prg_a_bin__analizarasignacion_tag_indicado.prg').Exclude = .T. .ITEM(lcCurdir + 'tests\ut__foxbin2prg__c_conversor_prg_a_bin__insert_allobjects.prg').Exclude = .T. .ITEM(lcCurdir + 'tests\ut__foxbin2prg__c_foxbin2prg__evaluarconfiguracion.prg').Exclude = .T. + .ITEM(lcCurdir + 'tests\ut__foxbin2prg__c_foxbin2prg__filenamefoundinfilter.prg').Exclude = .T. * * diff --git a/foxbin2prg.pjt b/foxbin2prg.pjt index 4eb5c404d23d70ae079c95930fb2fad03d7c8ea2..7330f17a269dfa6715014ffb2905437abd9d4528 100644 GIT binary patch delta 22570 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 delta 17593 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 diff --git a/foxbin2prg.prg b/foxbin2prg.prg index 4f0ab70..f886dec 100644 --- a/foxbin2prg.prg +++ b/foxbin2prg.prg @@ -97,6 +97,7 @@ * 21/07/2014 FDBOZZO v1.19.28 Mejora: Agregada funcionalidad para filtrado de tablas y datos cuando se elige DBF_Conversion_Support:4 (Edyshor) * 29/07/2014 FDBOZZO v1.19.29 Arreglo bug vcx/scx: Un campo de tabla llamado "text" que comienza la línea puede confundirse con la estructura TEXT/ENDTEXT y reconocer mal el resto del código * 07/08/2014 FDBOZZO v1.19.30 Arreglo bug vcx/scx: Cuando la línea anterior a un ENDTEXT termina en ";" o "," no se reconoce como ENDTEXT sino como continuación (Jim Nelson) +* 08/08/2014 FDBOZZO v1.19.30 Arreglo bug vcx/vct v1.19.29: En ciertos casos de herencia no se mantiene el orden alfabetico de algunos metodos (Ryan Harris) * * *--------------------------------------------------------------------------------------------------- @@ -137,6 +138,7 @@ * 21/07/2014 Edyshor PROPUESTA DE MEJORA db2 v1.19.27: Sería útil poder filtrar tablas y datos cuando se elige DBF_Conversion_Support:4 (Agregado en v1.19.28) * 29/07/2014 M_N_M REPORTE BUG vcx/scx v1.19.28: Los campos de tabla con nombre "text" a veces provocan corrupción del binario generado (Arreglado en v1.19.29) * 07/08/2014 Jim Nelson REPORTE BUG vcx/scx v1.19.29: Cuando la línea anterior a un ENDTEXT termina en ";" o "," no se reconoce como ENDTEXT sino como continuación (Arreglado en v1.19.30) +* 08/08/2014 Ryan Harris REPORTE BUG vcx/vct v1.19.29: En ciertos casos de herencia no se mantiene el orden alfabetico de algunos metodos (solucionado en v1.19.30) * * *--------------------------------------------------------------------------------------------------- @@ -1131,9 +1133,9 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM IF .l_AllowMultiConfig AND .l_ConfigEvaluated AND .l_Main_CFG_Loaded lo_CFG = CREATEOBJECT('CL_CFG') - lo_Configuration.Add( lo_CFG, lc_CFG_Path ) + lo_Configuration.Add( lo_CFG, lc_CFG_Path ) ELSE - lo_Configuration.Add( NULL, lc_CFG_Path ) + lo_Configuration.Add( NULL, lc_CFG_Path ) ENDIF FOR I = 1 TO ALINES( laConfig, FILETOSTR( lcConfigFile ), 1+4 ) @@ -1290,8 +1292,8 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM ENDCASE ENDFOR - IF .l_AllowMultiConfig AND .l_Main_CFG_Loaded AND lo_Configuration.Count > 0 - .n_CFG_Actual = lo_Configuration.Count &&lo_Configuration.GetKey( UPPER( JUSTPATH( lcConfigFile ) ) ) + IF .l_AllowMultiConfig AND .l_Main_CFG_Loaded AND lo_Configuration.Count > 0 + .n_CFG_Actual = lo_Configuration.Count &&lo_Configuration.GetKey( UPPER( JUSTPATH( lcConfigFile ) ) ) ENDIF ENDIF && llExisteConfig @@ -1378,18 +1380,18 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM * tcFilename (v! IN ) Nombre del archivo a evaluar * tcFilters (v! IN ) Filtros a evaluar (*,??E.*,R*.*) *--------------------------------------------------------------------------------------------------- - LPARAMETERS tcFilename, tcFilters - + LPARAMETERS tcFileName, tcFilters + LOCAL llFound, laFiltros(1) - tcFilename = UPPER(tcFilename) + tcFileName = UPPER(tcFileName) FOR I = 1 TO ALINES( laFiltros, tcFilters + ',', 1+4, ',' ) - IF LIKE( UPPER(laFiltros(I)), tcFilename ) + IF LIKE( UPPER(laFiltros(I)), tcFileName ) llFound = .T. EXIT ENDIF ENDFOR - + RETURN llFound ENDFUNC @@ -2718,8 +2720,8 @@ DEFINE CLASS c_conversor_base AS SESSION RETURN llEncontrado ENDPROC - - + + PROCEDURE decode_SpecialCodes_1_31 *--------------------------------------------------------------------------------------------------- * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) @@ -3035,7 +3037,7 @@ DEFINE CLASS c_conversor_base AS SESSION * tcAsignacion (v! IN ) Asignación completa con variable, igualdad y valor * tcPropName (@! OUT) Nombre de la variable * tcValue (@? OUT) Valor - * toClase (v! IN ) + * toClase (v! IN ) * taCodeLines (@! IN ) Líneas de código a analizar * tnCodeLines (v! IN ) Cantidad de líneas de código * I (@! IN/OUT) Línea actual @@ -4618,11 +4620,11 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base lcPropsMemo = .objectProps2Memo( toObjeto, toClase ) lcMethodsMemo = .objectMethods2Memo( toObjeto, toClase ) - IF EMPTY(toObjeto._TIMESTAMP) - toObjeto._TIMESTAMP = THIS.RowTimeStamp(DATETIME()) + IF EMPTY(toObjeto._TimeStamp) + toObjeto._TimeStamp = THIS.RowTimeStamp(DATETIME()) ENDIF - IF EMPTY(toObjeto._UNIQUEID) - toObjeto._UNIQUEID = SYS(2015) + IF EMPTY(toObjeto._UniqueID) + toObjeto._UniqueID = SYS(2015) ENDIF *-- Inserto el objeto @@ -4703,11 +4705,11 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base FOR X = 1 TO toClase._AddObject_Count loObjeto = toClase._AddObjects( X ) - IF EMPTY(loObjeto._TIMESTAMP) - loObjeto._TIMESTAMP = THIS.RowTimeStamp(DATETIME()) + IF EMPTY(loObjeto._TimeStamp) + loObjeto._TimeStamp = THIS.RowTimeStamp(DATETIME()) ENDIF - IF EMPTY(loObjeto._UNIQUEID) - loObjeto._UNIQUEID = SYS(2015) + IF EMPTY(loObjeto._UniqueID) + loObjeto._UniqueID = SYS(2015) ENDIF laObjNames( X, 1 ) = loObjeto._Nombre @@ -5875,11 +5877,11 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin LOOP ENDIF - IF EMPTY(loClase._TIMESTAMP) - loClase._TIMESTAMP = THIS.RowTimeStamp(DATETIME()) + IF EMPTY(loClase._TimeStamp) + loClase._TimeStamp = THIS.RowTimeStamp(DATETIME()) ENDIF - IF EMPTY(loClase._UNIQUEID) - loClase._UNIQUEID = SYS(2015) + IF EMPTY(loClase._UniqueID) + loClase._UniqueID = SYS(2015) ENDIF *-- Inserto la clase @@ -6178,11 +6180,11 @@ DEFINE CLASS c_conversor_prg_a_scx AS c_conversor_prg_a_bin LOOP ENDIF - IF EMPTY(loClase._TIMESTAMP) - loClase._TIMESTAMP = THIS.RowTimeStamp(DATETIME()) + IF EMPTY(loClase._TimeStamp) + loClase._TimeStamp = THIS.RowTimeStamp(DATETIME()) ENDIF - IF EMPTY(loClase._UNIQUEID) - loClase._UNIQUEID = SYS(2015) + IF EMPTY(loClase._UniqueID) + loClase._UniqueID = SYS(2015) ENDIF *-- Inserto la clase @@ -6417,8 +6419,8 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin lcMainProg = LOWER( SYS(2014, toProject._MainProg, ADDBS(toProject._HomeDir) ) ) ENDIF - IF EMPTY(toProject._TIMESTAMP) - toProject._TIMESTAMP = THIS.RowTimeStamp(DATETIME()) + IF EMPTY(toProject._TimeStamp) + toProject._TimeStamp = THIS.RowTimeStamp(DATETIME()) ENDIF IF EMPTY(toProject._ID) toProject._ID = INT(VAL(SYS(3))) @@ -6457,8 +6459,8 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin *-- Agrego los ARCHIVOS FOR EACH loFile IN toProject FOXOBJECT - IF EMPTY(loFile._TIMESTAMP) - loFile._TIMESTAMP = THIS.RowTimeStamp(DATETIME()) + IF EMPTY(loFile._TimeStamp) + loFile._TimeStamp = THIS.RowTimeStamp(DATETIME()) ENDIF IF EMPTY(loFile._ID) loFile._ID = INT(VAL(SYS(3))) @@ -8185,7 +8187,6 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base + [] ; + [] ; + [] ; - + [] ; + [] ; + [] ; + [] ; @@ -8274,10 +8275,6 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ENDIF *-- Genero el método SIN indentar, ya que se hace luego - *-- Sustituyo el TEXT/ENDTEXT aquí porque a veces quita espacios de la derecha, y eso es peligroso - *tcMethods = tcMethods + CR_LF + 'PROCEDURE ' + lcMethodName - *tcMethods = tcMethods + CR_LF + .IndentarMemo( taCode(taMethods(I,2)) ) - *tcMethods = tcMethods + CR_LF + 'ENDPROC' taCode(taMethods(I,2)) = 'PROCEDURE ' + lcMethodName + CR_LF + .IndentarMemo( taCode(taMethods(I,2)) ) + CR_LF + 'ENDPROC' taMethods(I,1) = lcMethodName ENDFOR @@ -8331,25 +8328,15 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base lnCommentRow = ASCAN( taPropsAndComments, '*' + lcMethodName, 1, 0, 1, 1+2+4+8) *-- Nombre del método - *TEXT TO lcMethods ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 - * <<>> <> <> - *ENDTEXT - *lcMethods = lcMethods + CR_LF + lcProcDef + ' ' + taMethods(I,1) lcMethod = lcProcDef + ' ' + taMethods(I,1) *-- Comentarios del método (si tiene) IF lnCommentRow > 0 AND NOT EMPTY(taPropsAndComments(lnCommentRow,2)) - *TEXT TO lcMethods ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 - * <<>> && <> - *ENDTEXT - *lcMethods = lcMethods + C_TAB + C_TAB + taPropsAndComments(lnCommentRow,2) lcMethod = lcMethod + C_TAB + C_TAB + '&' + '& ' + taPropsAndComments(lnCommentRow,2) ENDIF *-- Código del método IF taMethods(I,2) > 0 THEN - *lcMethods = lcMethods + CR_LF + .IndentarMemo( taCode(taMethods(I,2)), C_TAB + C_TAB ) - *lcMethod = lcMethod + CR_LF + .IndentarMemo( taCode(taMethods(I,2)), C_TAB + C_TAB ) taCode(taMethods(I,2)) = lcMethod + CR_LF + .IndentarMemo( taCode(taMethods(I,2)) ) + CR_LF + 'ENDPROC' ELSE lnLen = ALEN(taCode,1) + 1 @@ -8357,18 +8344,8 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base taCode( lnLen ) = lcMethod + CR_LF + 'ENDPROC' taMethods(I,2) = lnLen ENDIF - - *lcMethods = lcMethods + CR_LF + C_TAB + 'ENDPROC' - *lcMethods = lcMethods + CR_LF - - *lcMethod = lcMethod + CR_LF + C_TAB + 'ENDPROC' - *lcMethod = lcMethod + CR_LF - *lcMethods = lcMethods + lcMethod ENDFOR - ENDWITH && THIS - *C_FB2PRG_CODE = C_FB2PRG_CODE + C_TAB + lcMethods &&+ CR_LF - ENDIF CATCH TO loEx @@ -8593,7 +8570,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base tnProtected_Count = tnProtected_Count - 1 ENDIF ENDFOR - + DIMENSION taProtected(tnProtected_Count) ENDIF @@ -8754,12 +8731,6 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ASORT(taMethods,1,-1,0,1) ENDIF - *FOR I = 1 TO tnMethodCount - * IF taMethods(I,2) > 0 THEN - * tcSorted = m.tcSorted + taCode( taMethods(I,2) ) - * ENDIF - *ENDFOR - DIMENSION laMethods(tnMethodCount,3) lnDeleted = 0 @@ -8812,29 +8783,24 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base *-- ESTRUCTURA DE LOS ARRAYS CREADOS: *-- taMethods[1,3] - *-- Nombre Método - *-- Posición Original - *-- Tipo (HIDDEN/PROTECTED/NORMAL) + *-- 1.Nombre Método + *-- 2.Posición Original + *-- 3.Tipo (HIDDEN/PROTECTED/NORMAL) *-- taCode[1] - *-- Bloque de código del método en su posición original + *-- 1.Bloque de código del método en su posición original TRY LOCAL lnLineCount, laLine(1), I, lnTextNodes, tcSorted, lnProtectedLine, lcMethod, lnLine_Len, lcLine, llProcOpen ; , laLineasExclusion(1), lnBloquesExclusion ; , loEx AS EXCEPTION - *DIMENSION taMethods(1,3) - *STORE '' TO taMethods, tcSorted, taCode - *tnMethodCount = 0 IF NOT EMPTY(m.tcMethod) AND LEFT(m.tcMethod,9) == "ENDPROC"+CHR(13)+CHR(10) tcMethod = SUBSTR(m.tcMethod,10) ENDIF IF NOT EMPTY(m.tcMethod) - DIMENSION laLine(1) &&, taMethods(1,3) + DIMENSION laLine(1) STORE '' TO laLine STORE 0 TO lnTextNodes - *STORE '' TO taMethods, taCode - *STORE 0 TO tnMethodCount lnLineCount = ALINES(laLine, m.tcMethod) && NO aplicar nungún formato ni limpieza, que es el CÓDIGO FUENTE @@ -8869,7 +8835,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base *-- Identifico los TEXT/ENDTEXT, #IF .F./#ENDIF THIS.identificarBloquesDeExclusion( @laLine, lnLineCount, .F., @laLineasExclusion, @lnBloquesExclusion ) - + *-- Analyze and count line methods, get method names and consolidate block code FOR I = 1 TO lnLineCount IF toFoxBin2Prg.l_DropNullCharsFromCode @@ -8881,7 +8847,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base DO CASE CASE laLineasExclusion(I) taCode(tnMethodCount) = taCode(tnMethodCount) + laLine(I) + CR_LF - + CASE lnTextNodes = 0 AND UPPER( LEFT(laLine(I), 10) ) == 'PROCEDURE ' tnMethodCount = tnMethodCount + 1 DIMENSION taMethods(tnMethodCount, 3), taCode(tnMethodCount) @@ -9057,7 +9023,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base *-- Finalmente, todos los métodos los ordeno y escribo juntos LOCAL laMethods(1), laCode(1), lnMethodCount, I, lcMethods - IF tnMethodCount > 0 THEN + IF tnMethodCount > 0 THEN STORE '' TO lcMethods DIMENSION laMethods(1,3) @@ -9074,10 +9040,6 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base LOOP ENDIF - *lcMethods = lcMethods + CR_LF + C_TAB + laMethods(I,3) + C_PROCEDURE + ' ' + laMethods(I,1) - *lcMethods = lcMethods + CR_LF + .IndentarMemo( laCode(laMethods(I,2)), CHR(9) + CHR(9) ) - *lcMethods = lcMethods + CR_LF + C_TAB + C_ENDPROC - lcMethods = lcMethods + CR_LF + .IndentarMemo( taCode(taMethods(I,2)), CHR(9) + CHR(9), .T. ) lcMethods = lcMethods + CR_LF ENDFOR @@ -9090,86 +9052,6 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ENDPROC - ******************************************************************************************************************* - PROCEDURE write_CLASS_METHODS - LPARAMETERS tnMethodCount, taMethods, taCode, taProtected, taPropsAndComments - *-- DEFINIR MÉTODOS DE LA CLASE - *-- Ubico los métodos protegidos y les cambio la definición - EXTERNAL ARRAY taMethods, taCode, taProtected, taPropsAndComments - - TRY - LOCAL lcMethod, lcMethodName, lnProtectedItem, lnCommentRow, lcProcDef, lcMethods - STORE '' TO lcMethod, lcMethodName, lcProcDef, lcMethods - - IF tnMethodCount > 0 THEN - WITH THIS AS c_conversor_bin_a_prg OF 'FOXBIN2PRG.PRG' - FOR I = 1 TO tnMethodCount - lcMethodName = CHRTRAN( taMethods(I,1), '^', '' ) - lnProtectedItem = ASCAN( taProtected, taMethods(I,1), 1, 0, 0, 1+2+4) - - IF lnProtectedItem = 0 - lnProtectedItem = ASCAN( taProtected, taMethods(I,1) + '^', 1, 0, 0, 1+2+4) - - IF lnProtectedItem = 0 - *-- Método común - lcProcDef = 'PROCEDURE' - ELSE - *-- Método oculto - lcProcDef = 'HIDDEN PROCEDURE' - ENDIF - ELSE - *-- Método protegido - lcProcDef = 'PROTECTED PROCEDURE' - ENDIF - - lnCommentRow = ASCAN( taPropsAndComments, '*' + lcMethodName, 1, 0, 1, 1+2+4+8) - - *-- Nombre del método - *TEXT TO lcMethods ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 - * <<>> <> <> - *ENDTEXT - *lcMethods = lcMethods + CR_LF + lcProcDef + ' ' + taMethods(I,1) - lcMethod = CR_LF + lcProcDef + ' ' + taMethods(I,1) - - *-- Comentarios del método (si tiene) - IF lnCommentRow > 0 AND NOT EMPTY(taPropsAndComments(lnCommentRow,2)) - *TEXT TO lcMethods ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 - * <<>> && <> - *ENDTEXT - *lcMethods = lcMethods + C_TAB + C_TAB + taPropsAndComments(lnCommentRow,2) - lcMethod = lcMethod + C_TAB + C_TAB + taPropsAndComments(lnCommentRow,2) - ENDIF - - *-- Código del método - IF taMethods(I,2) > 0 THEN - *lcMethods = lcMethods + CR_LF + .IndentarMemo( taCode(taMethods(I,2)), C_TAB + C_TAB ) - lcMethod = lcMethod + CR_LF + .IndentarMemo( taCode(taMethods(I,2)), C_TAB + C_TAB ) - ENDIF - - *lcMethods = lcMethods + CR_LF + C_TAB + 'ENDPROC' - *lcMethods = lcMethods + CR_LF - lcMethod = lcMethod + CR_LF + C_TAB + 'ENDPROC' - lcMethod = lcMethod + CR_LF - lcMethods = lcMethods + lcMethod - ENDFOR - - ENDWITH && THIS - C_FB2PRG_CODE = C_FB2PRG_CODE + C_TAB + lcMethods &&+ CR_LF - - ENDIF - - CATCH TO loEx - IF THIS.l_Debug AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF - - THROW - ENDTRY - - RETURN - ENDPROC - - ******************************************************************************************************************* PROCEDURE write_CLASS_PROPERTIES LPARAMETERS toRegClass, taPropsAndValues, taPropsAndComments, taProtected ; @@ -10144,7 +10026,6 @@ DEFINE CLASS c_conversor_vcx_a_prg AS c_conversor_bin_a_prg .Method2Array( loRegClass.METHODS, @laMethods, @laCode, '', @lnMethodCount ; , @laPropsAndComments, lnPropsAndComments_Count, @laProtected, lnProtected_Count, @toFoxBin2Prg ) - *.write_CLASS_METHODS( @lnMethodCount, @laMethods, @laCode, @laProtected, @laPropsAndComments ) .get_CLASS_METHODS( @lnMethodCount, @laMethods, @laCode, @laProtected, @laPropsAndComments ) lnLastClass = 1 @@ -10388,7 +10269,6 @@ DEFINE CLASS c_conversor_scx_a_prg AS c_conversor_bin_a_prg .Method2Array( loRegClass.METHODS, @laMethods, @laCode, '', @lnMethodCount ; , @laPropsAndComments, lnPropsAndComments_Count, @laProtected, lnProtected_Count, @toFoxBin2Prg ) - *.write_CLASS_METHODS( @lnMethodCount, @laMethods, @laCode, @laProtected, @laPropsAndComments ) .get_CLASS_METHODS( @lnMethodCount, @laMethods, @laCode, @laProtected, @laPropsAndComments ) lnLastClass = 1 @@ -11405,7 +11285,7 @@ DEFINE CLASS c_conversor_dbf_a_prg AS c_conversor_bin_a_prg toFoxBin2Prg.writeLog(' ' + JUSTFNAME(.c_InputFile) + ' está en el filtro DBF_Conversion_Excluded (' + toFoxBin2Prg.DBF_Conversion_Excluded + ')' ) EXIT ENDIF - + loDBFUtils.getDBFmetadata( .c_InputFile, @ln_HexFileType, @ll_FileHasCDX, @ll_FileHasMemo, @ll_FileIsDBC, @lc_DBC_Name ) lc_FileTypeDesc = loDBFUtils.fileTypeDescription(ln_HexFileType) lnDatabases_Count = ADATABASES(laDatabases) @@ -16206,7 +16086,7 @@ DEFINE CLASS CL_DBF_TABLE AS CL_CUS_BASE IF FILE(lcTableCFG) toFoxBin2Prg.writeLog() toFoxBin2Prg.writeLog('* Found configuration file: ' + lcTableCFG) - + *-- Leer valores de configuración FOR I = 1 TO ALINES( laConfig, FILETOSTR( lcTableCFG ), 1+4 ) lcConfigItem = LOWER( laConfig(I) ) @@ -16225,15 +16105,15 @@ DEFINE CLASS CL_DBF_TABLE AS CL_CUS_BASE ENDCASE ENDFOR - + IF NOT EMPTY(lc_DBF_Conversion_Order) lcIndexFile = FORCEEXT(tc_InputFile,'IDX') INDEX ON &lc_DBF_Conversion_Order. TO (lcIndexFile) COMPACT toFoxBin2Prg.writeLog(' > Using Index order key: ' + lc_DBF_Conversion_Order) ENDIF - + ENDIF - + *** DH 06/02/2014: added _Records loRecords = THIS._Records lcText = lcText + loRecords.toText(@laFields, lnFieldCount, lc_DBF_Conversion_Condition) @@ -16855,7 +16735,7 @@ DEFINE CLASS CL_DBF_RECORDS AS CL_COL_BASE ENDTEXT loRecord = CREATEOBJECT('CL_DBF_RECORD') - + IF EMPTY(tc_DBF_Conversion_Condition) tc_DBF_Conversion_Condition = '.T.' ENDIF